创建第n级数组列表的数组树
Create array tree of nth level form array list
我只有第N个层次数组return,这个函数return所有children列表
$arr = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a'),
);
$new = array();
foreach ($arr as $a){
$new[$a['parentid']][] = $a;
}
$tree = createTree($new, array($arr[0]));
print_r($tree);
function createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['id']])){
$l['children'] = createTree($list, $list[$l['id']]);
}
$tree[] = $l;
}
return $tree;
}
此函数return数组中的所有数据。
此功能return不能return特定级别完成然后中断并return值
这样试试。
$array = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a')
);
echo '<pre>';
print_r(array_to_tree($array));
exit;
转换树的函数。
function array_to_tree(array $array, $parent_id = 0)
{
$array = array_combine(array_column($array, 'id'), array_values($array));
foreach ($array as $k => &$v) {
if (isset($array[$v['parentid']])) {
$array[$v['parentid']]['children'][$k] = &$v;
}
unset($v);
}
return array_filter($array, function($v) use ($parent_id) {
return $v['parentid'] == $parent_id;
});
}
输出将是。
根据您的要求,您只需要 2 个级别,然后不要使用递归函数。
//从 foreach
中删除 createTree
function createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['id']])){
$l['children'] = $list[$l['id']]; //remove createTree from here.
}
$tree[] = $l;
}
return $tree;
}
这会预处理输入数据,以便它们的处理顺序为父 ID 降序,然后 ID 升序。这意味着您可以一次性累积所有菜单(代码中的一些注释)...
$array = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a')
);
print_r(array_to_tree($array));
function array_to_tree ( array $input ): array {
$new = [];
// Sort data in reverse order of parent ID, normal order of ID within parent ID
usort($input, function ( $a, $b ) {
return ( $a['parentid'] == $b['parentid'] )?
$a['id']- $b['id']:
$b['parentid'] - $a['parentid'];
});
foreach ( $input as $inp ) {
// Add data to parent ID
$new[$inp['parentid']][$inp['id']] = $inp;
// If data already exists for this ID, then this is also a parent
if ( isset( $new[$inp['id']]) ) {
// Add existing data to new item and remove old one
$new[$inp['parentid']][$inp['id']] += $new[$inp['id']];
unset($new[$inp['id']]);
}
}
return $new;
}
我只有第N个层次数组return,这个函数return所有children列表
$arr = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a'),
);
$new = array();
foreach ($arr as $a){
$new[$a['parentid']][] = $a;
}
$tree = createTree($new, array($arr[0]));
print_r($tree);
function createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['id']])){
$l['children'] = createTree($list, $list[$l['id']]);
}
$tree[] = $l;
}
return $tree;
}
此函数return数组中的所有数据。
此功能return不能return特定级别完成然后中断并return值
这样试试。
$array = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a')
);
echo '<pre>';
print_r(array_to_tree($array));
exit;
转换树的函数。
function array_to_tree(array $array, $parent_id = 0)
{
$array = array_combine(array_column($array, 'id'), array_values($array));
foreach ($array as $k => &$v) {
if (isset($array[$v['parentid']])) {
$array[$v['parentid']]['children'][$k] = &$v;
}
unset($v);
}
return array_filter($array, function($v) use ($parent_id) {
return $v['parentid'] == $parent_id;
});
}
输出将是。
根据您的要求,您只需要 2 个级别,然后不要使用递归函数。 //从 foreach
中删除 createTreefunction createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['id']])){
$l['children'] = $list[$l['id']]; //remove createTree from here.
}
$tree[] = $l;
}
return $tree;
}
这会预处理输入数据,以便它们的处理顺序为父 ID 降序,然后 ID 升序。这意味着您可以一次性累积所有菜单(代码中的一些注释)...
$array = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),
array('id'=>101, 'parentid'=>100, 'name'=>'a'),
array('id'=>102, 'parentid'=>101, 'name'=>'a'),
array('id'=>103, 'parentid'=>101, 'name'=>'a')
);
print_r(array_to_tree($array));
function array_to_tree ( array $input ): array {
$new = [];
// Sort data in reverse order of parent ID, normal order of ID within parent ID
usort($input, function ( $a, $b ) {
return ( $a['parentid'] == $b['parentid'] )?
$a['id']- $b['id']:
$b['parentid'] - $a['parentid'];
});
foreach ( $input as $inp ) {
// Add data to parent ID
$new[$inp['parentid']][$inp['id']] = $inp;
// If data already exists for this ID, then this is also a parent
if ( isset( $new[$inp['id']]) ) {
// Add existing data to new item and remove old one
$new[$inp['parentid']][$inp['id']] += $new[$inp['id']];
unset($new[$inp['id']]);
}
}
return $new;
}