【问题标题】:Create Tree Structure from Array in PHP在 PHP 中从数组创建树结构
【发布时间】:2021-12-31 19:01:18
【问题描述】:

我有一个这样的数组:

array(
      array(id => 7, parent_id => 0, name => Current Assets)
      array(id => 8, parent_id => 0, name => Fixed Assets)
      array(id => 18, parent_id => 7, name => Assets)
      array(id => 38, parent_id => 18, name => Receivable)
      array(id => 38, parent_id => 18, name => Inventory)
      array(id => 39, parent_id => 0, name => Landed Cost Of Inventory)
      array(id => 40, parent_id => 38, name => Jazz Cash)
      array(id => 41, parent_id => 39, name => Advance to Vendors)
)

现在我需要一些有效的方法来将它转换成这样的树结构。

array(
      array(id => 7, parent_id => 0, name => Current Assets, level=>0)
      array(id => 8, parent_id => 0, name => Fixed Asset, level => )
      array(id => 18, parent_id => 7, name => Assets, level => 1)
      array(id => 38, parent_id => 18, name => Inventory, level => 2)
      array(id => 39, parent_id => 0, name => Landed Cost Of Inventory, level => 0)
      array(id => 40, parent_id => 38, name => Jazz Cash, level => 3)
      array(id => 41, parent_id => 39, name => Advance to Vendors, level => 1)
)

我不需要向左或向右添加它们,我只需要我将传递给 jQgrid 的简单关卡。

【问题讨论】:

    标签: php arrays treeview


    【解决方案1】:

    在一个数组中按parent -> child 的顺序收集所有ID,其中parent_id 是键,它有一个包含所有子ID 的数组。第二步是遍历树并分配等级。

    <?php
    
    function assignLevels(&$data){
        $kids = [];
    
        foreach($data as $d){
            $kids[ $d['parent_id'] ] = $kids[ $d['parent_id'] ] ?? [];
            $kids[ $d['parent_id'] ][] = $d['id'];
        }
        
        $data = array_column($data, null, 'id');
        traverseTree($kids, 0, $data);
        $data = array_values($data);
    }
    
    
    function traverseTree($kids, $id, &$data, $level = 0){
        foreach($kids[ $id ] as $sub_id){
            $data[ $sub_id ]['level'] = $level;
            if(isset($kids[ $sub_id ] )) traverseTree($kids, $sub_id, $data, $level + 1);
        }
    }
    
    assignLevels($data);
    
    print_r($data);
    

    Online Demo

    【讨论】:

    • 它只创建到 1 级,如查看此处 Array ( [id] => 29 [parent_id] => 23 [name] => 输出税 [hasChild] => 1 [parent_name] = > [value] => 15480 [level] => 1 ) 数组 ( [id] => 31 [parent_id] => 29 [name] => 销售税 (输出) [hasChild] => 0 [parent_name] => [ value] => 120000 [level] => 1) 数组 id 31 的 level 应该是 2
    • @TahirLilla 你能在 var_export() 中粘贴输入数组吗?
    • 0: {id: '7', parent_id: '0', name: 'Current Assets', value: 16000, level: 0} 1: {id: '39', parent_id: ' 23', name: 'Advance from Customers', value: 0, level: 1} 2: {id: '42', parent_id: '15', name: 'Cost- Wallpaper', value: 0, level: 1} 3: {id: '35', parent_id: '15', name: '碳酸饮料成本', value: 0, level: 1} 4: {id: '16', parent_id: '0', name: 'Operating Expenses', value: 0, level: 0} 5: {id: '15', parent_id: '0', name: 'Cost of Good Sold', value: 0, level: 0}
    • 16: {id: '29', parent_id: '23', name: 'Output Tax', value: 15480, level: 1}
    • 成功了!我只是对数组进行排序然后传递它,谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多