从 PHP 中的数组创建树结构
Create Tree Structure from Array in PHP
我有一个这样的数组:
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 的简单级别。
按照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);
我有一个这样的数组:
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 的简单级别。
按照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);