如何在PHP中实现多线程递归?

时间:2012-07-27 08:13:05

标签: php recursion

我有一个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则不会返回任何内容。我的事情发生由于分支递归。我想知道如何解决这个问题。

2 个答案:

答案 0 :(得分: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;

但我想这不是真的,你在寻找什么;)

答案 1 :(得分: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;

}