鍍金池/ 問(wèn)答/人工智能  PHP  C++/ 這段php代碼怎么個(gè)執(zhí)行邏輯,沒(méi)看懂請(qǐng)教一下?

這段php代碼怎么個(gè)執(zhí)行邏輯,沒(méi)看懂請(qǐng)教一下?

     $items = array(
            1 => array('id' => 1, 'pid' => 0, 'name' => '北京市'),
            2 => array('id' => 2, 'pid' => 0, 'name' => '黑龍江省'),
            3 => array('id' => 3, 'pid' => 1, 'name' => '海淀區(qū)'),
            4 => array('id' => 4, 'pid' => 2, 'name' => '哈爾濱市'),
            6 => array('id' => 6, 'pid' => 3, 'name' => '清華大學(xué)'),
            5 => array('id' => 5, 'pid' => 2, 'name' => '雞西市'),
            7 => array('id' => 7, 'pid' => 3, 'name' => '北京大學(xué)')
        );
    print_r($this->genTree5($items));
    //這個(gè)函數(shù)怎么理解
    public function genTree5($items) {
        foreach ($items as $item)
            $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
        return isset($items[0]['son']) ? $items[0]['son'] : array();
    }

我在網(wǎng)上找的無(wú)限分類轉(zhuǎn)換n維數(shù)組,5行就完成了,我看不懂啊。也看不到他哪遞歸了,然而就是這么牛。跟蹤調(diào)試一下,$items[$item['pid']]'son'];就這里一直重復(fù)執(zhí)行。然后就能輸出多維數(shù)組,感覺(jué)好強(qiáng)大。誰(shuí)能幫我分析一下,他這個(gè)是咋個(gè)執(zhí)行的邏輯。

我比較菜,還有點(diǎn)笨,就是喜歡代碼這東西。

Array
(
    [1] => Array
        (
            [id] => 1
            [pid] => 0
            [name] => 北京市
            [son] => Array
                (
                    [3] => Array
                        (
                            [id] => 3
                            [pid] => 1
                            [name] => 海淀區(qū)
                            [son] => Array
                                (
                                    [6] => Array
                                        (
                                            [id] => 6
                                            [pid] => 3
                                            [name] => 清華大學(xué)
                                        )

                                    [7] => Array
                                        (
                                            [id] => 7
                                            [pid] => 3
                                            [name] => 北京大學(xué)
                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [id] => 2
            [pid] => 0
            [name] => 黑龍江省
            [son] => Array
                (
                    [4] => Array
                        (
                            [id] => 4
                            [pid] => 2
                            [name] => 哈爾濱市
                        )

                    [5] => Array
                        (
                            [id] => 5
                            [pid] => 2
                            [name] => 雞西市
                        )

                )

        )

)
回答
編輯回答
櫻花霓

引用傳值

$items 循環(huán)改變的是自身

比如第一次循環(huán)引用傳值變成了 $arr, 第二次循環(huán)也就是循環(huán)的$arr,就等于當(dāng)前循環(huán)的數(shù)組沒(méi)每循環(huán)一次,初始數(shù)據(jù)都是上一次循環(huán)的結(jié)果。

第一次變成這樣 以此類推

$arr=[
  [
      "id"=>1,
      "pid"=>0,
      "name"=>'北京市',
      "son"=>[
          [
              "id"=>3,
              "pid"=>1,
              "name"=>"海淀區(qū)"
          ]
      ]
  ],
  [
      "id"=>1,
      "pid"=>0,
      "name"=>'黑龍江省',
  ]
];

2017年6月12日 16:35
編輯回答
瞄小懶

是沒(méi)有用遞歸,用的是引用。

你把每次循環(huán)后的 $items 打印出來(lái)看一下就會(huì)知道它是怎么工作的。

基本邏輯就是每次循環(huán)為當(dāng)前元素找到它的上一級(jí),并把當(dāng)前的元素引用傳遞給上一級(jí)的 son 。
最后把 $items中 pid為0的,即最頂級(jí)元素打印出出來(lái)。

2017年3月21日 19:06
編輯回答
硬扛

這個(gè)實(shí)現(xiàn)的太牛逼了,數(shù)據(jù)要多的話,速度比遞歸快幾百倍??墒俏疫€是看不太懂,數(shù)組嵌套的我頭暈。我也知道什么是引用,以前用過(guò)。就是把變量地址,例如傳給一個(gè)子函數(shù),子函數(shù)如果改變了這個(gè)值,那么誰(shuí)傳給他的,誰(shuí)也跟著改變。就是他們共享了一個(gè)存儲(chǔ)地址。原理知道,但是這個(gè)還是看不太懂。

2018年3月25日 05:02