二维数组根据 pid 以及 id 变为无限极分类状的数组
将要转化的数组
$arr = [
['id'=>1,'pid'=>0,'name'=>'a'],
['id'=>2,'pid'=>1,'name'=>'b'],
['id'=>3,'pid'=>1,'name'=>'c'],
['id'=>4,'pid'=>2,'name'=>'d'],
['id'=>5,'pid'=>2,'name'=>'e'],
['id'=>6,'pid'=>3,'name'=>'f'],
['id'=>7,'pid'=>3,'name'=>'g'],
];
转化完毕的形式
array(3) {
["id"]=>
int(1)
["name"]=>
string(1) "a"
["children"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(1) "b"
["children"]=>
array(2) {
[0]=>
array(2) {
["id"]=>
int(4)
["name"]=>
string(1) "d"
}
[1]=>
array(2) {
["id"]=>
int(5)
["name"]=>
string(1) "e"
}
}
}
[1]=>
array(3) {
["id"]=>
int(3)
["name"]=>
string(1) "c"
["children"]=>
array(2) {
[0]=>
array(2) {
["id"]=>
int(6)
["name"]=>
string(1) "f"
}
[1]=>
array(2) {
["id"]=>
int(7)
["name"]=>
string(1) "g"
}
}
}
}
}
核心代码
function list_to_tree($list) {
$tree = array();// 创建Tree
if(is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data['id']] = &$list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data['pid'];
if (0 == $parentId) {
$tree = &$list[$key];
}else{
if (isset($refer[$parentId])) {
$parent = &$refer[$parentId];
$parent['children'][] = &$list[$key];
}
}
}
}
return $tree;
}
到这里一个无限极分类就已经出来
function jPid(&$tree){
unset($tree['pid']);
if(isset($tree['children'])){
foreach($tree['children'] as $k=>$v){
$this->jPid($tree['children'][$k]);
}
}
return $tree;
}
无限极分类
核心部分=&
&在php中是引用的意思,PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
<?php
$b =&$a;
?>
这意味着 $a 和 $b 指向了同一个变量。 $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。