Php 在树数据结构中按id查找元素
树样本:Php 在树数据结构中按id查找元素,php,tree,php-5.3,Php,Tree,Php 5.3,树样本: root / | \ 1 2 4 / /|\ 3 5 6 7 / \ 13 14 我有一个函数,递归地在树中搜索元素。例如,我想查找元素#6 公共函数getChildById($root,$id){ 如果(!empty($root->nodes)){ foreach($root->nodes as$node){ echo$node->ge
root
/ | \
1 2 4
/ /|\
3 5 6 7
/ \
13 14
我有一个函数,递归地在树中搜索元素。例如,我想查找元素#6
公共函数getChildById($root,$id){
如果(!empty($root->nodes)){
foreach($root->nodes as$node){
echo$node->getId()。“
”;
如果($node->getId()==$id){
//如果我在这里写'echo$node->getId(),它会成功地找到当前路径和最后一个id,但返回的结果是nothing'
返回$node;
}否则{
//如果我在这里加上return,它会找到6个元素,它会在13停止
/*返回*/$this->getChildById($node,$id);
}
}
}
}
我写了一些评论,请帮帮我,我做错了什么?事实确实在中间:当你不返回递归调用的值时,你就丢失了你收集的信息。另一方面,当您返回递归调用的值时,它将不起作用,因为您将始终在
foreach
循环的第一次迭代中返回
因此,有时需要返回它:仅当递归部分中有匹配项时。如果未成功,则不应返回并继续执行foreach
循环:
public function getChildById($root, $id){
if (!empty($root->nodes)){
foreach ($root->nodes as $node){
if ($node->getId()==$id){
return $node;
} else {
$found = $this->getChildById($node, $id);
if ($found) return $found;
}
}
}
}
看它继续跑
请注意,在根上进行匹配测试更为常见,因此在函数开始时。它可以归结为相同的事情,除了如果值位于调用函数的根上,它也会被找到
public function getChildById($root, $id){
if ($root->getId()==$id) return $root;
foreach ($root->nodes as $node){
$found = $this->getChildById($node, $id);
if ($found) return $found;
}
}
您没有捕获递归调用的返回值。并且无法发出搜索失败的信号(例如,当您到达节点13时,您必须返回一些信息,以表明在该分支中未找到任何内容(并且未找到任何内容),因此“父”调用将知道转到下一个同级节点。非常感谢!现在我理解了这一点
public function getChildById($root, $id){
if ($root->getId()==$id) return $root;
foreach ($root->nodes as $node){
$found = $this->getChildById($node, $id);
if ($found) return $found;
}
}