2010-12-10 53 views
1

Je développe une fonction pour analyser 2 fichiers XML. Il les compare nœud par nœud et si les nœuds sont différents, la fonction doit retourner l'un d'entre eux. Mais il ne retourne rien.Retour sur une fonction récursive dans php

$xml = simplexml_load_file("file1.xml"); 
$xml2 = simplexml_load_file("file2.xml"); 

$result = parseNode($xml, $xml2); 
print_r($result); 
echo $result; 

function parseNode($node1, $node2) { 

    for ($i = 0; $i < count($node1->children()); $i++) { 

     $child1 = $node1->children(); 
     $child2 = $node2->children(); 

     if ($child1[$i]->getName() != $child2[$i]->getName()) { 
      return $child1[$i]; 
     } else { 
      parseNode($child1[$i], $child2[$i]); 
     } 

    } 
} 

Répondre

1

Eh bien, vous pouvez le faire avec une simple déclaration conditionnelle ...

$xml = simplexml_load_file("file1.xml"); 
$xml2 = simplexml_load_file("file2.xml"); 

$result = parseNode($xml, $xml2); 
print_r($result); 
echo $result; 

function parseNode($node1, $node2) { 
    $child1 = $node1->children(); 
    $child2 = $node2->children(); 
    $numChildren = count($child1); 
    for ($i = 0; $i < $numChildren; $i++) { 
     if ($child1[$i]->getName() != $child2[$i]->getName()) { 
      return $child1[$i]; 
     } else { 
      $test = parseNode($child1[$i], $child2[$i]); 
      if ($test) return $test; 
     } 
    } 
    return false; 
} 
+0

C'est tout! Merci: 3 –

0

Il n'y a pas return dans l'appel récursif. Par conséquent, aucun résultat.

EDIT Ne pas voter pour ceci. ircmaxell a raison. J'ai supprimé la partie d'exception de ma réponse.

+0

-1 pour abus d'exceptions. Ce n'est pas une circonstance exceptionnelle, donc il n'y a pas de raison pour tous les frais généraux associés à des exceptions ... – ircmaxell

+0

Quel serait ce frais généraux? Et où est-il un "abus"? N'est-ce pas une déclaration de contrôle de flux? –

+0

print_r ($ result) et echo $ result n'impriment toujours rien. –

3
 return parseNode($child1[$i], $child2[$i]); 
+0

print_r (résultat $) et résultat echo $ n'impriment toujours rien. –

+0

J'ai eu un problème connexe. La récursivité ne retournerait rien sur les clés de tableau qui étaient plus profondes que le niveau racine. Retour ajouté et cela a fonctionné. Merci @hwlau – pistolshrimp

1

Vous pouvez également en boucle sur les structures XML en utilisant itérateurs récursifs pour simplifier votre fonction parseNodes().

$xml = simplexml_load_string("<root><foo/><bar><baz/></bar></root>", "SimpleXMLIterator"); 
$xml2 = simplexml_load_string("<root><foo/><bar><baz/></bar><bat/></root>", "SimpleXMLIterator"); 

$result = parseNode($xml, $xml2); 
echo $result; 

function parseNode($a, $b) { 
    $mit = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|MultipleIterator::MIT_KEYS_NUMERIC); 
    $mit->attachIterator(new RecursiveIteratorIterator($a, RecursiveIteratorIterator::SELF_FIRST)); 
    $mit->attachIterator(new RecursiveIteratorIterator($b, RecursiveIteratorIterator::SELF_FIRST)); 

    foreach ($mit as $node) { 
     // One has more nodes than another! 
     if ( ! isset($node[0], $node[1])) { 
      return 'Curse your sudden but inevitable betrayal!'; 
     } 
     // Nodes have different names 
     if ($node[0]->getName() !== $node[1]->getName()) { 
      return $node[0]; 
     } 
    } 

    // No differences in names and order 
    return FALSE; 
} 

Configuration du MultipleIterator est assez bavard (la plupart du temps en raison des noms de classe über-longue), mais la logique est simple fichue.