首页 > 解决方案 > 如何在 PHP 中从数组构建树结构

问题描述

我有下表:

$arr = array(
  array('id'=>100, 'year'=>2019, 'month'=>9, 'name'=>'a'),
  array('id'=>101, 'year'=>2019, 'month'=>12, 'name'=>'b'),
  array('id'=>102, 'year'=>2020, 'month'=>1, 'name'=>'c'),
  array('id'=>103, 'year'=>2020, 'month'=>2, 'name'=>'d'),
);

使用下面的代码

$tree = array();
foreach ($arr as $row) {
    $tree[$row['year']] = array(
        $row['month'] => array (
            'id' => $row['id'],
            'name' => $row['name'],
        ),
    );
}

我想得到以下结果 - 这个结构是一棵树:

Array
(
    [2019] => Array
        (
            [9] => Array
                (
                    [id] => 100
                    [name] => a
                )
            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )
        )

    [2020] => Array
        (
            [1] => Array
                (
                    [id] => 102
                    [name] => c
                )
            [2] => Array
                (
                   [id] => 103
                   [name] => d
                )
        )
)

不幸的是,我只得到一个带有单个“分支”的关注:

Array
(
    [2019] => Array
        (
            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )
        )

    [2020] => Array
        (
            [2] => Array
                (
                   [id] => 103
                   [name] => d
                )
        )
)

这里缺少什么?为什么前面的行从结构中消失了?

标签: phparraystree

解决方案


由于您希望将年份和月份作为主要索引,因此在将数据添加到$tree...

$tree = array();
foreach ($arr as $row) {
    $tree[$row['year']][$row['month']] = [   'id' => $row['id'],
            'name' => $row['name']];
}

使用您的测试数据,这给出了...

Array
(
    [2019] => Array
        (
            [9] => Array
                (
                    [id] => 100
                    [name] => a
                )

            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )

        )

    [2020] => Array
        (
            [1] => Array
                (
                    [id] => 102
                    [name] => c
                )

            [2] => Array
                (
                    [id] => 103
                    [name] => d
                )

        )

)

推荐阅读