我正在使用大约 15,000 个节点并尝试从它们构建层次结构。节点不能以任何方式排序,每个节点都可以有无限数量的孩子——但父母总是会在他们的孩子之前被喂给这个函数。我的代码适用于 N 的小值,但最终超过服务器上的最大执行时间 N>2,000。我不确定是否有更好的方法来做到这一点,但这就是我所拥有的:
function insertNode(&$treeNode, $insertNode) {
if($insertNode['DEPTH'] <= $treeNode['DEPTH']) return false;
if($treeNode['ID'] == $insertNode['PARENT_ID']) {
$treeNode['CHILDREN'][] = $insertNode;
$treeNode['CHILD_COUNT']++;
return true;
}
else {
foreach($treeNode['CHILDREN'] as $key=>$value) {
$found = insertNode($treeNode['CHILDREN'][$key], $insertNode);
if($found) {
$treeNode['CHILD_COUNT']++;
return true;
}
}
}
}
我现在最好的解决方案是将递归限制为仅构建几千个深度节点,然后在 Javascript 中为每个底部节点调用脚本,直到树真正完成。不过,我宁愿一口气把它全部搞定。