foreach ($items as $item){
$items[$item['pid']] ['son'][$item['id']] = &$items[$item['id']];
}
第一次运行的时候$item['pid'] = 0,我们知道$items是从下标1开始的,也就是说第一次运行添加了下标为0的数组(不知道为什么在数组的最下边)。
并且$items[0][son][1]与$items[1]是传址关系。对其中一个操作会影响另一个。
array(8) {
[1]=>
&array(3) {
["id"]=>
int(1)
["pid"]=>
int(0)
["name"]=>
string(9) "北京市"
}
[2]=>
array(3) {
["id"]=>
int(2)
["pid"]=>
int(0)
["name"]=>
string(12) "黑龙江省"
}
[3]=>
array(3) {
["id"]=>
int(3)
["pid"]=>
int(1)
["name"]=>
string(9) "海淀区"
}
[4]=>
array(3) {
["id"]=>
int(4)
["pid"]=>
int(2)
["name"]=>
string(12) "哈尔滨市"
}
[6]=>
array(3) {
["id"]=>
int(6)
["pid"]=>
int(3)
["name"]=>
string(12) "清华大学"
}
[5]=>
array(3) {
["id"]=>
int(5)
["pid"]=>
int(2)
["name"]=>
string(9) "鸡西市"
}
[7]=>
array(3) {
["id"]=>
int(7)
["pid"]=>
int(3)
["name"]=>
string(12) "北京大学"
}
[0]=> 这里添加了一个元素
array(1) {
["son"]=>
array(1) {
[1]=>
&array(3) {
["id"]=>
int(1)
["pid"]=>
int(0)
["name"]=>
string(9) "北京市"
}
}
}
}
-------------------------------------------------------------
第二次运行的时候$item['pid'] = 0,并且$item['id']是不同的,即会为$items[0]['son']添加一个元素。
[0]=>
array(1) {
["son"]=>
array(2) {
[1]=>
&array(3) {
["id"]=>
int(1)
["pid"]=>
int(0)
["name"]=>
string(9) "北京市"
}
[2]=>
&array(3) {
["id"]=>
int(2)
["pid"]=>
int(0)
["name"]=>
string(12) "黑龙江省"
}
}
}
}
-------------------------------------------------------------
第三次运行的时候$item['pid'] = 1,此时$items[1]是存在的,也就是说会将$items[$item['id']]元素添加到$items[1]['son']中。又因为$items[1]跟$items[0]['son'][1]是传址关系,即也会添加到$items[0]['son'][1];$items[0]['son']就是我们要的结果数组;之后同理
array(8) {
[1]=>
&array(4) {
["id"]=>
int(1)
["pid"]=>
int(0)
["name"]=>
string(9) "北京市"
["son"]=>
array(1) {
[3]=>
&array(3) {
["id"]=>
int(3)
["pid"]=>
int(1)
["name"]=>
string(9) "海淀区"
}
}
}
[2]=>
&array(3) {
["id"]=>
int(2)
["pid"]=>
int(0)
["name"]=>
string(12) "黑龙江省"
}
[3]=>
&array(3) {
["id"]=>
int(3)
["pid"]=>
int(1)
["name"]=>
string(9) "海淀区"
}
[4]=>
array(3) {
["id"]=>
int(4)
["pid"]=>
int(2)
["name"]=>
string(12) "哈尔滨市"
}
[6]=>
array(3) {
["id"]=>
int(6)
["pid"]=>
int(3)
["name"]=>
string(12) "清华大学"
}
[5]=>
array(3) {
["id"]=>
int(5)
["pid"]=>
int(2)
["name"]=>
string(9) "鸡西市"
}
[7]=>
array(3) {
["id"]=>
int(7)
["pid"]=>
int(3)
["name"]=>
string(12) "北京大学"
}
[0]=>
array(1) {
["son"]=>
array(2) {
[1]=>
&array(4) {
["id"]=>
int(1)
["pid"]=>
int(0)
["name"]=>
string(9) "北京市"
["son"]=>
array(1) {
[3]=>
&array(3) {
["id"]=>
int(3)
["pid"]=>
int(1)
["name"]=>
string(9) "海淀区"
}
}
}
[2]=>
&array(3) {
["id"]=>
int(2)
["pid"]=>
int(0)
["name"]=>
string(12) "黑龙江省"
}
}
}
}
return isset($items[0]['son']) ? $items[0]['son'] : array();
通过之前的分析这边就好理解了。就是将$items[0]['son']返回回去
调试
function genTree5($items) {
foreach ($items as $item){
$items[$item['pid']] ['son'][$item['id']] = &$items[$item['id']];
echo "
";
var_dump($items);
echo '-------------------------------------------------------------';
}
return isset($items[0]['son']) ? $items[0]['son'] : array();
}