Zephyr (./6) :
Le code de ton premier post est insuffisant pour trouver le problème, si tu utilises des références ailleurs il y a de grandes chances que ce soit ça qui fasse n'importe quoi :/
(vérifie par exemple que tu ne fais pas de "$var = null;" quand "$var" est une référence, et que tu appelles bien unset() à la place)
Oui, j'utilise des références un peu partout, mais uniquement en lecture seule, je ne change jamais la variable d'origine... c'est ça que je ne comprends pas

function topologicalOrder(& $vertices) {
$topo = array();
$numerical = array();
$original = array();
$visited = array();
foreach($vertices as $key => & $vertex) {
$idV = $vertex->idV;
$numerical[$idV] = new vertex($vertex->idV, 0);
$numerical[$idV]->out = $vertex->out;
$numerical[$idV]->in = $vertex->in;
$original[$idV] = & $vertex;
$visited[$idV] = FALSE;
}
while(count($numerical) > 0) {
$v = FALSE;
// on cherche un sommet sans père
foreach($numerical as $idV => & $vertex) {
if(count($vertex->in) == 0) { $v = & $vertex; break; }
}
if($v === FALSE) return FALSE;// le graphe contient au moins un cycle
// on ajoute ce sommet à la fin de la liste
$father = $v->idV;
$topo[] = & $original[$father];
// il faut le supprimer des parents de ses fils
foreach($v->out as $son) {
foreach($numerical[$son]->in as $key => $value) {
if($value == $father) { unset($numerical[$son]->in[$key]); }
}
}
// on le supprime
unset($numerical[$father]);
}
for($w = 0; $w < count($topo); $w++) {
echo " classe de $w ", get_class($topo[$w]), " \n";
}
return $topo;
}
sachant que le tableau vertices est initialisé proprement, avec une boucle du genre
vertices[] = new vertex(.... )(et je n'utilise que des unset)