6Fermer8
flankerLe 05/06/2008 à 17:20
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 sad

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)