php - 誰能清楚的解釋這個無限分級函數麼?
学习ing
学习ing 2017-06-29 10:08:08
0
6
710

用是會用,但每次看的時候理解不了,誰能解釋清除麼? &引用賦值在這裡如何理解?

$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
    2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
    3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
    4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
    5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
);
function getTree($items){
    $tree = array();
    foreach($items as $item){
        if(isset($items[$item['pid']])){
            $items[$item['pid']]['son'][] = &$items[$item['id']];
        }else{
            $tree[] = &$items[$item['id']];
        }
    }
    return $tree;
}
学习ing
学习ing

全部回覆(6)
習慣沉默

主要是引用的使用,可以簡化下測:

  • 有引用時:

$item1= array('id' => 1, 'pid' => 0, 'name' => '安徽省');
$item2= array('id' => 2, 'pid' => 0, 'name' => '浙江省');
$item3=array('id' => 3, 'pid' => 1, 'name' => '合肥市');
$tree[] = &$item1;//注意引用
$item1['son']=&$item2;//注意引用
$item2['son']=$item3;
print_r($tree);
  • 無引用時:

$item1= array('id' => 1, 'pid' => 0, 'name' => '安徽省');
$item2= array('id' => 2, 'pid' => 0, 'name' => '浙江省');
$item3=array('id' => 3, 'pid' => 1, 'name' => '合肥市');
$tree[] = $item1;//注意无引用
$item1['son']=$item2;//注意无引用
$item2['son']=$item3;
print_r($tree);

有引用時子元素的改變都會在整個數組中展示出來,而無引用時,子元素的變動對整個數組沒有影響。

巴扎黑

沒人麼,求解釋

迷茫

是這樣的, foreach 括號中的items => a 和循環體中的items => b 在內存中存在兩個地方. 使用會指向a 即真正的items. 但是在 php7

之後,

foreach 變了一些 => php7 foreach 不向後相容特性

世界只因有你

引用賦值,是說將賦值左邊的直接指向記憶體中儲存這個值的這塊區域,而不是開闢一塊新空間去接收資料的副本。

所以,在父子級別關係中,引用賦值直接將父元素中的['son'],直接指向了子元素的那片存儲區,而並非只是存了值而已。每個父元素都將['son']指向對應子元素的儲存區,這樣,其實在記憶體裡已經連接形成了一個樹形的結構,而由於所有的父元素裡['son'] 都是指向了子元素的記憶體區,所以,輸出數組中的父子關係和記憶體裡的資料關係樹基本上是一致的。

世界只因有你

參考@vishun

雷雷
雷雷
雷雷
大家讲道理

看到了以上的回答,我還是想回答一下,引用再PHP里和指針在C/C++裡的用法類似,相當於操作這個變數的指針,這樣子的話,在函數裡操作這個引用變數也就觸發本身的變數更改。
引用能帶來一些好處:因為是直接操作“指針”,效率很高,不會產生多餘的內存浪費以及消耗開闢內存的性能;

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!