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