2010-12-10 22 views
1

私は2つのXMLファイルを解析する関数を開発しています。それらをノードごとに比較し、ノードが異なる場合、関数はそれらのうちの1つを返す必要があります。しかし、それは何も戻っていません。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]); 
     } 

    } 
} 

答えて

1

さて、あなたは簡単な条件文でそれを行うことができます...

$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

それはそれです!ありがとう:3 –

0

再帰呼び出しには、returnはありません。したがって、結果はありません。

EDITこれを無効にしないでください。 ircmaxellが正しいです。私は私の答えの例外部分を削除しました。

+0

-1例外の悪用。それは例外的な状況ではないので、例外に関連するすべてのオーバーヘッドの理由はありません。 – ircmaxell

+0

それはどんなオーバーヘッドでしょうか?そして、「虐待」はどこにありますか?フロー制御ステートメントではありませんか? –

+0

print_r($ result)とecho $ resultは何も印刷しません。 –

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

print_r($ result)とecho $ resultは何も印刷しません。 –

+0

私は関連する問題がありました。再帰は、ルートレベルよりも深い配列キーでは何も返しません。追加されたリターンとそれは働いた。ありがとう@hwlau – pistolshrimp

1

あなたは可能性も、あなたのparseNodes()機能を簡素化するために、再帰的なイテレータを使用してXML構造をループ。 MultipleIteratorの設定

$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; 
} 

はかなり冗長(ユーバー長いクラス名のほとんどが原因)であるが、ロジックがとびきり簡単です。