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 回答