PHP递归遍历对象树

4
我有一个$branch对象,可以包含其他$branch对象:
$branch->children(); 

每个人都可以有“苹果”作为子元素。
$branch->apples();

我该如何递归地从$branch中收集所有的$apple呢?
function collectApples($branch){
    $apples = array();
    ?
    return $apples;
}

寻找关于如何遍历树的“教科书”示例。 - Halcyon
$branch 是一个对象吗?我如何获取其他分支以及如何获取苹果? - gbtimmon
1
了解PHP的SPL迭代器和array_merge_recursive。 - Xeoncross
树遍历 -> RecursiveIterator - hakre
2个回答

5

使用深度优先搜索(DFS)收集特定分支的所有苹果:

function collectApples($branch) {
    $apples = $branch->apples();
    foreach ($branch->children() as $child) {
        $apples = array_merge($apples, collectApples($child));
    }
    return $apples;
}

这个问题中,应该将$child->apples()改为collectApples($child),以实现递归操作。 - gbtimmon

1
function collectApples($branch) {
    $apples = $branch->apples();
    foreach ($branch->children() as $child) 
        $apples = array_merge($apples, collectApples($child));
    return $apples;
}

@TimCooper的回答只能获取一代子元素,而对他的回答进行轻微修改后,您将获得所有子代和子代的子代的苹果(根据我对问题的理解)。您可以在此处检查样本:http://phpfiddle.org/main/code/9dk-zjc
编辑说明:在撰写本答案时,@TimCooper的答案尚不完整-现在它们是相同的。

1
这不就是和我的代码完全一样吗? - user142162
1
@TimCooper 当我开始回答这个问题时还没有,但是现在你已经更正了。不幸的是,编辑时不会提醒你正在编写答案。为了澄清,我的答案已经更新以反映这一事件。 - Brandon Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接