【问题标题】:How to build tree structure from array in PHP如何在 PHP 中从数组构建树结构
【发布时间】:2020-04-18 11:43:01
【问题描述】:

我有下表:

$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
                )
        )
)

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

【问题讨论】:

    标签: php arrays tree


    【解决方案1】:

    由于要将年份和月份作为主要索引,因此在将数据添加到$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
                    )
    
            )
    
    )
    

    【讨论】:

      【解决方案2】:

      您的密钥名称有误 - bl_year, bl_month 不存在:

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

      【讨论】:

      • 确实我犯了错误,但在帖子中。在原始代码中,这里没有错误。我更正了这个问题。
      • 此代码无法回答问题,因为给定您的月份会被覆盖
      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      相关资源
      最近更新 更多