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,"pid"=>1), array("id"=>4,"pid"=>2), array("id"=>5,"pid"=>2), array("id"=>6,"pid"=>3), array("id"=>7,"pid"=>3), array("id"=>1,"pid"=>0), ); $refer=array();//存盤主鍵與陣列單元的參考關系 //遍歷 foreach($data as $k=>$v){ $refer[$v['id']]=&$data[$k];//為每個陣列成員建立對應關系 } //遍歷2 foreach($data as $k=>$v){ $parent=&$refer[$v['pid']];//獲取父分類的參考 $parent['child'][]=&$data[$k];//在父分類的children中再添加一個參考成員 } print_r($data);
利用了一個$refer陣列,時間復雜度是O(n) , 只需要單層回圈,直接通過參考修改$data原資料,生成一個樹狀結構
Array ( [0] => Array ( [id] => 2 [pid] => 1 [child] => Array ( [0] => Array ( [id] => 4 [pid] => 2 ) [1] => Array ( [id] => 5 [pid] => 2 ) ) ) [1] => Array ( [id] => 3 [pid] => 1 [child] => Array ( [0] => Array ( [id] => 6 [pid] => 3 ) [1] => Array ( [id] => 7 [pid] => 3 ) ) ) [2] => Array ( [id] => 4 [pid] => 2 ) [3] => Array ( [id] => 5 [pid] => 2 ) [4] => Array ( [id] => 6 [pid] => 3 ) [5] => Array ( [id] => 7 [pid] => 3 ) [6] => Array ( [id] => 1 [pid] => 0 [child] => Array ( [0] => Array ( [id] => 2 [pid] => 1 [child] => Array ( [0] => Array ( [id] => 4 [pid] => 2 ) [1] => Array ( [id] => 5 [pid] => 2 ) ) ) [1] => Array ( [id] => 3 [pid] => 1 [child] => Array ( [0] => Array ( [id] => 6 [pid] => 3 ) [1] => Array ( [id] => 7 [pid] => 3 ) ) ) ) ) )
$a='aaa'; $b=&$a; $c=&$b; xdebug_debug_zval('a','b','c');
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80850.html
標籤:PHP
