PHP数组 - 如何将一维数组转换为嵌套的多维数组?

6

从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的子元素都将被推入它们父元素的数组中。
请看以下示例以获得进一步的说明: alt text http://img263.imageshack.us/img263/4986/array.gif 这可能导致一个复杂的递归操作,因为我必须始终检查是否已经存在具有任何特定ID的父元素(如果存在,将其值推入其数组中)。
是否有内置的php函数可以帮助我完成这个任务?您有关于如何构建此功能的任何想法吗?值得一提的是,我正在使用它来构建WordPress中的导航栏(其中可以包含类别、子类别、帖子等任何内容)。
2个回答

1

这个想法是你保留一个辅助数组,其中包含你找到的所有节点(父节点和子节点)。该数组的值是引用,可以支持你的结果。

这样可以在线性时间内构建树(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);

提供

array(1) {
  [3]=>
  array(1) {
    [7]=>
    array(1) {
      [8]=>
      array(3) {
        [11]=>
        array(0) {
        }
        [99]=>
        array(0) {
        }
        [16]=>
        array(0) {
        }
      }
    }
  }
}

编辑:最后取消 $childrenTable 变量的引用标记。在实际应用中,您可能希望将此操作放在函数内执行。


感谢你的努力,我现在正在尝试使用它,看看它是否确实是防弹的。 - Gal

1

这个问题及其答案对您应该有所帮助:将数据库结果转换为数组

请务必阅读@Bill Karwin的PDF演示文稿,特别是关于Closure表的主题。


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