我有这个数组:
$arr = [
["id"=>20,
"name"=>"a",
"parent"=>28,
],
["id"=>21,
"name"=>"a-child",
"parent"=>20,
],
["id"=>27,
"name"=>"a-child-b",
"parent"=>20,
],
["id"=>28,
"name"=>"A parent",
"parent"=>0,
],
["id"=>12,
"name"=>"no parent",
"parent"=>0,
]];
我想要的是根据父键对其进行分组,其中parent = id&&父母> 0或id是此元素的父元素,如果父键大于零,则元素具有父元素.
在上面的数组中,id = 12没有父节点,id = 20有子节点21,27,它是id = 28的子节点.
我做了什么 :
public function sort($arr){
$result = [];
// Get child
foreach($arr as $key => $row) {
if($row['parent'] > 0) {
$result[$row->parent][] = ['id' => $row['id'], 'name' => $row['name']];
unset($arr[$key]);
}
}
// Get parent and append child
foreach($arr as $key => $row) {
$result[$row['id']] = ['name' => $row['name'],
'child' => $result[$row['id']]];
}
return $result;
}
那个问题是,这只适用于1级孩子,如父母=>子数组().
我想要的是一个获取参数的方法(在数组之上),我不知道,我将拥有多少级别的嵌套,并按父键数组返回:
$arr = [
["id"=>28,
"name"=>"A parent",
"parent"=>0,
'child' => [
["id"=>20,
"name"=>"a",
"parent"=>28,
'child' => [
["id"=>21,
"name"=>"a-child",
"parent"=>20,
],
["id"=>27,
"name"=>"a-child-b",
"parent"=>20,
]
]
]
]
],
["id"=>12,
"name"=>"no parent",
"parent"=>0,
]];
解决方法:
<?PHP
define('ROOT_PARENT',0);
function getHierarchy($records){
$hierarchy = [];
/*
let's assume everybody is going to be a parent
*/
foreach($records as $each_record){
$each_record['child'] = [];
$hierarchy[$each_record['id']] = $each_record;
}
/*
Now add child to parent's key in $hierarchy in the 'child' key.
The & is important since there may be future childs for current child. So pass by reference is needed
*/
foreach($records as $each_record){
$hierarchy[$each_record['parent']]['child'][] = &$hierarchy[$each_record['id']];
}
/*
here I unset every key which wasn't at root level,i.e is 0(top) level
*/
foreach($hierarchy as $parent => $its_data){
if($parent != ROOT_PARENT){
unset($hierarchy[$parent]);
}
}
return isset($hierarchy[ROOT_PARENT],$hierarchy[ROOT_PARENT]['child']) ? $hierarchy[ROOT_PARENT]['child'] : [];
}
$records = [
[
"id" => 20,
"name" => "a",
"parent" => 28,
],
[
"id" => 21,
"name" => "a-child",
"parent" => 20,
],
[
"id" => 27,
"name" => "a-child-b",
"parent" => 20,
],
[
"id" => 28,
"name" => "A parent",
"parent" => 0,
],
[
"id" => 12,
"name" => "no parent",
"parent" => 0,
]
];
echo "<pre>";
print_r(getHierarchy($records));
输出:
Array
(
[0] => Array
(
[id] => 28
[name] => A parent
[parent] => 0
[child] => Array
(
[0] => Array
(
[id] => 20
[name] => a
[parent] => 28
[child] => Array
(
[0] => Array
(
[id] => 21
[name] => a-child
[parent] => 20
[child] => Array
(
)
)
[1] => Array
(
[id] => 27
[name] => a-child-b
[parent] => 20
[child] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => 12
[name] => no parent
[parent] => 0
[child] => Array
(
)
)
)
首先,我们认为每个人都可以成为父母.然后,在它的父母的子键中,我们继续添加它的子项.我们通过引用传递密钥,因为可能有未来的孩子.最后,取消设置()来自不是根父级的层次结构中的每个人.最后,您拥有最终的层次结构.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。