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”有了三个引用 , 并且是is_ref是引用类型,那也就意味着不管是我修改$b ,还是修改$c,"aaa"这个都会被改变
可以根据上面这个原理来把一个数据库存储的带pid的逐行数据,变成一个多层级的树状结构
$data=array( array("id"=>2,"pid"=>1),array("id"=>3,1)">array("id"=>4,"pid"=>2),1)">array("id"=>5,1)">array("id"=>6,"pid"=>3),1)">array("id"=>7,1)">array("id"=>1,"pid"=>0),1)"> ); $refer=array();//存储主键与数组单元的引用关系 //遍历 foreach($data as $k=>$v){ $refer[$v['id']]=&$data[$k];为每个数组成员建立对应关系 } 遍历2 ){ $parent=&$v['pid']];获取父分类的引用 $parent['child'][]=&在父分类的children中再添加一个引用成员 print_r($data);
利用了一个$refer数组,时间复杂度是O(n),只需要单层循环,直接通过引用修改$data原数据,生成一个树状结构
Array ( [0] => ( [id] => 2 [pid] => 1 [child] => ( [0] => ( [id] => 4 [pid] => 2 ) [1] => ( [id] => 5 ) ) ) [1] => ( [id] => 3 ( [id] => 6 [pid] => 3 ( [id] => 7 ) ) ) [2] => ( [id] => 4 [pid] => 2 ) [3] => ( [id] => 5 ) [4] => ( [id] => 6 [pid] => 3 ) [5] => ( [id] => 7 ) [6] => ( [id] => 1 [pid] => 0 ( [id] => 2 [pid] => 1 [child] => ( [0] => ( [id] => 4 [pid] => 2 ) [1] => ( [id] => 5 ) ) ) [1] => ( [id] => 3 ( [id] => 6 [pid] => 3 ( [id] => 7 ) ) ) ) ) )
$a='aaa';
$b=&$a;
$c=$b;
xdebug_debug_zval('a','b',1)">'c');