PHP中的引用是两个变量指向同一个地方,只要在变量前面加上&符号就变成了引用$a='aaa';$b=&$a;$c=&$b;xdebug_debug_zval('a','b','c');输出为:a:(refcount=3,is_ref=1)='aaa'b:(refcount=3,is_ref=1)='aaa'c:(refcount=3,is_ref=1)='aaa'"aaa”有3个引用,而is_ref是引用类型,也就是说无论我是修改$b还是修改$c,“aaa”都会改变这个。根据以上原理,可以将数据库中存储的带pid的逐行数据转化为多级树结构$data=array(array("id"=>2,"pid"=>1),数组("id"=>3,"pid"=>1),数组("id"=>4,"pid"=>2),数组("id"=>5,"pid"=>2),数组("id"=>6,"pid"=>3),数组("id"=>7,"pid"=>3),数组("id"=>1,"pid"=>0));$refer=array();//存储主键与数组单元的引用关系//遍历foreach($dataas$k=>$v){$refer[$v['id']]=&$data[$k];//为每个数组成员建立对应关系}//遍历2foreach($dataas$k=>$v){$parent=&$refer[$v['pid']];//获取父类的引用$parent['child'][]=&$data[$k];//为父类的子类添加另一个引用成员}print_r($data);使用$refer数组创建,时间复杂度为O(n)。只需要单层循环,直接通过引用修改$data的原始数据,生成树形结构Array([0]=>Array([id]=>2[pid]=>1[child]=>数组([0]=>数组([id]=>4[pid]=>2)[1]=>数组([id]=>5[pid]=>2)))[1]=>数组([id]=>3[pid]=>1[child]=>数组([0]=>数组([id]=>6[pid]=>3)[1]=>数组([id]=>7[pid]=>3)))[2]=>数组([id]=>4[pid]=>2)[3]=>数组([id]=>5[pid]=>2)[4]=>数组([id]=>6[pid]=>3)[5]=>数组([id]=>7[pid]=>3)[6]=>数组([id]=>1[pid]=>0[child]=>数组([0]=>数组([id]=>2[pid]=>1[child]=>数组([0]=>数组([id]=>4[pid]=>2)[1]=>大批([id]=>5[pid]=>2))[1]=>数组([id]=>3[pid]=>1[child]=>数组([0]=>数组([id]=>6[pid]=>3)[1]=>数组([id]=>7[pid]=>3))))))$a='aaa';$b=&$a;$c=&$b;xdebug_debug_zval('a','b','c');
