当从 MySQL 检索层次结构(具有一个 ID 列和一个 PARENT 列表示层次关系的表)时,我将结果映射到一个枚举数组,如下所示(对于本示例,数字是任意的):
Array ( [3] => Array ( [7] => Array () ), [7] => Array ( [8] => Array () ) )
注意,3 是 7 的父级,7 是 8 的父级(这可以一直持续下去;任何父级都可以有多个子级)。
我想将此数组缩小为嵌套多维数组,如下所示:
Array ( [3] => Array ( [7] => Array ( [8] => Array () ) ) )
那是,每个新的 id 都会自动分配一个空数组。无论如何,任何 ID 的子级都会被推入其父级的数组中。
请看下图以进一步说明:
替代文本http://img263.imageshack.us/img263/4986/array.gif http://img263.imageshack.us/img263/4986/array.gif
这可能会导致复杂的递归操作,因为我总是必须检查具有特定 ID 的父级是否已存在(如果是这样,则将该值推入其数组中)。
有没有内置的 php 函数可以帮助我解决这个问题?您知道如何构建这个吗?就其价值而言,我使用它在 WordPress 中构建了一个导航栏(可以包含类别、子类别、帖子......本质上是任何内容)。
这个想法是你保留一个辅助数组,其中包含你找到的所有节点(父节点和子节点)。该数组的值是支持结果的引用。
这会在线性时间内构建树(array_key_exists 执行哈希表查找,平均时间为 O(1)):
//table contains (id, parent)
$orig = array(
11 => 8,
7 => 3,
8 => 7,
99 => 8,
16 => 8,
);
$childrenTable = array();
$result = array();
foreach ($orig as $n => $p) {
//parent was not seen before, put on root
if (!array_key_exists($p, $childrenTable)) {
$childrenTable[$p] = array();
$result[$p] = &$childrenTable[$p];
}
//child was not seen before
if (!array_key_exists($n, $childrenTable)) {
$childrenTable[$n] = array();
}
//root node has a parent after all, relocate
if (array_key_exists($n, $result)) {
unset($result[$n]);
}
$childrenTable[$p][$n] = &$childrenTable[$n];
}
unset($childrenTable);
var_dump($result);
gives
array(1) {
[3]=>
array(1) {
[7]=>
array(1) {
[8]=>
array(3) {
[11]=>
array(0) {
}
[99]=>
array(0) {
}
[16]=>
array(0) {
}
}
}
}
}
编辑:未设置$childrenTable
最后清除参考标志。在实践中,您可能无论如何都想在函数内进行操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)