Va quedando más claro, pero aún así estoy liado. Es un problema complejo que hay que tener bien entendido para llevar a cabo una programación lo más inteligente y eficiente posible.
 
Corrígeme si me equivoco: 
Tenemos las Áreas.
En cada Área puede haber muchas materias. Cada área tiene disponible un cupo de horas semanales y un cupo de horas totales (que son independientes las unas de las otras). 
Tenemos las Materias.
Cada materia pertenece a un área. Cada materia tiene un número de horas semanales, y un número de horas totales (que son independientes  las unas de las otras).  
Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que restarle a areaB de su cantidad de horasSemanales y de su cantidad de horasTotales las correspondientes a materia4, y esas mismas cantidades de hora sumarselas a areaC. 
Y el problema de todo esto es que no tengo por ningún sitio las horas totales areaB ni del areaC; que tengo las horas que me quedan disponibles del areaB, ¿no es asi? 
--------------  
En ese caso lo que yo haría sería casi casi descargarme en javascript en el documento el total de las horas disponibles de cada área, las horas que ocupa una materia, y a qué área pertenece cada materia. 
Luego con javascript calculamos ya los movimientos, restas de allí, sumas aquí... lo que sea. Pero veo que por un lado o por otro vamos a necesitar todos esos datos disponibles en javascript. Para ello podrías usar la estructura de "clases-objetos" que tiene javascript. Te hago un esbozo que podrías utilizar:  
 Código PHP:
    function area(nombre,horasTotales,horasSemanales) {
    this.nombre = nombre;
    this.horasTotales = horasTotales;
    this.horasSemanales = horasSemanales;
    this.susMaterias = new Array();
    this.getHorasTotalesDisponibles = function() {
        //sumamos todas las horasTotales de las materias que tiene este área, y el resultado se lo restamos a this.horasTotales
    }
    this.getHorasSemanalesDisponibles = function() {
        //sumamos todas las horasSemanales de las materias que tiene este área, y el resultado se lo restamos a this.horasSemanales
    }
    this.cabeMateria = function( objMateria ) {
        // devuelve true si la materia cabe según las horasTotalesDisponibes y las horasSemanalesDisponibles
    }
    this.anyadirMateria = function( objMateria ) {
        this.susMaterias[ this.susMaterias.length ] = objMateria;
    }
    this.eliminarMateria = function( objMateria ) {
        //contrar objMateria en this.susMaterias y eliminarla del array
    }
}
 
 
function materia(nombre,horasTotales,horasSemanales) {
    this.nombre = nombre;
    this.horasTotales = horasTotales;
    this.horasSemanales = horasSemanales;
}
 
 
var area1 = new area("Área sociolingüística", 100, 10);
var area2 = new area("Área Matemáticas", 200, 20);
var area3 = new area("Área taller", 500, 50);
//...
var materia1 = new materia("Materia Lengua PGS", 40, 4);
var materia2 = new materia("Matemáticas", 50, 10);
//...
 
// añado materia1 a area1
if( area1.cabeMateria(materia1) )
    area1.anyadirMateria(materia1);
//...
//... 
    
  No sé si estás familiarizado con este tipo de sintaxis, yo creo que es la más legible.   
Pero sí, definitivamente creo que tendrás que volcar todas las áreas, asignaturas y sus respectivas características al código javascript, para después poder operar...      
O eso.. o hacer las comprobaciones mediante AJAX, pero no se me da tan bien, tendrías que preguntar en su foro.   
Un saludo y corrígeme si me equivoco.