1

私はXMLのようなカテゴリツリーを持っています

<cat name='cat_1' id='1'>

 <cat name='cat_2' id='2'>
   <cat name='cat_3' id='3'>

   </cat>
 </cat>

 <cat name='cat_4' id='4'>
   <cat name='cat_5' id='5'>

      <cat name='cat_6' id='6'>
        <cat name='cat_7' id='7'>

        </cat>
      </cat>
  </cat>  
 </cat>

</cat>

ここで、このツリーをトラバースして、名前でカテゴリIDを検索できるようにコードを実装します。つまり、入力がcat_6の場合、結果は6になります。

私がしたこと

$xmlCatTree//は私の単純なxmlオブジェクトです

class MyClass{   
 public function traverseForId($cat_name , $xmlCatTree )
      {

        if($xmlCatTree->attributes()->name == $cate_name)
            {
              return $xmlCatTree->attributes()->id;
            }
        if(count($item->children())>0){
        foreach($item->children() as $child)
        {
             return $this->traverseForId($cat_name,$child);
        } } 

      } 

}

これは単一のブランチに対して完全に機能します。つまり、cat_2の子ノードは正しい結果になりますが、cat_7を検索しても何も返されません。分岐再帰が原因で発生します。これをどうやってコピーするか知りたいです。

4

2 に答える 2

3

を使用しているようですSimpleXMLので、ツリーを直接クエリすることをお勧めします。

foreach ($xmlCatTree->xpath('//cat[@name=' . $cat_name . ']') as $node)
  return $node->attributes()->id;
}
return null;

これは、達成しようとしていることを直接反映しているため、さらに洗練されています。属性「name」と値「」を持つすべてのノードを教えてください$cat_name

または(IDがすでにカテゴリ名の一部になっているようです;))

list($unusedThingy, $id) = array_pad(explode('_', $cat_name, 2), 2, null);
return $id;

しかし、それはあなたが探しているものではないと思います;)

于 2012-07-27T08:19:28.367 に答える
1

関数は最初の子のみをチェックします。私のコードを使用してみてください:

public function traverseForId($cat_name, $xmlCatTree)
{
    if ($xmlCatTree->attributes()->name == $cat_name)
        return $xmlCatTree->attributes()->id;

    foreach ($xmlCatTree->children() as $child) {
        $res = $this->traverseForId($cat_name, $child);
        if($res)
            return $res;
    }
    return NULL;

}
于 2012-07-27T08:21:19.367 に答える