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;
    }           
}