搜尋

首頁  >  問答  >  主體

php - 誰能清楚的解釋這個無限分級函數麼?

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

$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学习ing2765 天前759

全部回覆(6)我來回復

  • 習慣沉默

    習慣沉默2017-06-29 10:10:08

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

    • 有引用時:

    $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);

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-29 10:10:08

    沒人麼,求解釋

    回覆
    0
  • 迷茫

    迷茫2017-06-29 10:10:08

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

    之後,

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

    回覆
    0
  • 世界只因有你

    世界只因有你2017-06-29 10:10:08

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

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

    回覆
    0
  • 世界只因有你

    世界只因有你2017-06-29 10:10:08

    參考@vishun

    雷雷
    雷雷
    雷雷

    回覆
    0
  • 大家讲道理

    大家讲道理2017-06-29 10:10:08

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

    回覆
    0
  • 取消回覆