我有这个功能,其基本操作概述如下:
function render($index) {
foreach($things[$index] as $key => $data) {
echo '<div>';
/* irrelevant operations */
if(isset($data['id'])) {
echo '<div class="wrap">';
render($things[$data['id']]);
echo '</div>';
}
echo '</div>';
}
}
我不能为我的生活弄清楚如何优化这个功能;我担心如果调用堆栈太大,PHP会崩溃。
有没有办法优化这个功能?
答案 0 :(得分:9)
你不得不担心,这是非常值得怀疑的。如果你的div足够深,使得调用堆栈填满,那么递归深度是你最不担心的。
答案 1 :(得分:3)
你正在做的是有效地遍历一棵树。基本上,这并不比仅打印树中的所有值更糟糕。它是否因为它太大而遇到任何特定的麻烦?这棵树的嵌套程度有多深?
答案 2 :(得分:3)
您不需要使用递归来对树进行深度优先遍历;它恰好工作真的很好。如果吹嘘你的筹码是一个问题,你可以在所有元素上运行一个长循环,只保持最后和当前位置。递归是一种更简单且(通常)更好的方式来执行深度优先遍历。
答案 3 :(得分:3)
此代码未经测试,但从我的头脑中,迭代函数看起来应该是这样的:
function render($index){
$stack = array();
array_push($index);
$pre = '';
$post = '';
while(!empty($stack)){
$idx = array_pop($stack);
foreach($things[$idx] as $key => $value){
$pre .= '<1>';
$spost = '';
if(isset($data['id'])){
$pre .= '<2 class="wrap">';
$spost .= '</2>';
$stack[] = $things[$data['id']];
}
$spost .= '</1>';
$post .= $spost;
}
}
return $pre . $post;
}