PHP無限級分類 代碼問題

來源:互聯網
上載者:User
自己試著寫了個無限級分類的,結果有些問題,想了很長時間了,感覺代碼沒問題呀,可就是結果不正確。現在整個人都懵了....

網上的栗子看了些,貌似寫法跟我的不一樣。

數組結構如下:

Array(    [0] => Array        (            [id] => 1            [name] => 代碼            [parent] => 0        )    [1] => Array        (            [id] => 3            [name] => 動漫            [parent] => 0        )    [2] => Array        (            [id] => 4            [name] => 治癒            [parent] => 3        )    [3] => Array        (            [id] => 5            [name] => 勵志            [parent] => 3        )    [4] => Array        (            [id] => 6            [name] => 機戰            [parent] => 3        )    [5] => Array        (            [id] => 7            [name] => 百合            [parent] => 3        )    [6] => Array        (            [id] => 8            [name] => 資源            [parent] => 0        )    [7] => Array        (            [id] => 9            [name] => app            [parent] => 8        )    [8] => Array        (            [id] => 10            [name] => 軟體            [parent] => 8        )    [9] => Array        (            [id] => 11            [name] => 黑科技            [parent] => 8        ))

其中 id 為分類唯一ID, parent 為父類ID
我寫的代碼 如下:

    function all($id=0){            static $_class = null;            if(is_null($_class))                    $_class = select();  //這個得出來的就是以上的數組結構,然後賦值給了`$_class`變數            $result = array();            foreach($_class as $k => $v){                    if($v['parent'] == $id){                            unset($_class[$k]);                            $v = array_merge($v, $this->all($v['id']));                            $result['child'][] = $v;                    }            }            return $result;    }    print_r(all(0));

回複內容:

自己試著寫了個無限級分類的,結果有些問題,想了很長時間了,感覺代碼沒問題呀,可就是結果不正確。現在整個人都懵了....

網上的栗子看了些,貌似寫法跟我的不一樣。

數組結構如下:

Array(    [0] => Array        (            [id] => 1            [name] => 代碼            [parent] => 0        )    [1] => Array        (            [id] => 3            [name] => 動漫            [parent] => 0        )    [2] => Array        (            [id] => 4            [name] => 治癒            [parent] => 3        )    [3] => Array        (            [id] => 5            [name] => 勵志            [parent] => 3        )    [4] => Array        (            [id] => 6            [name] => 機戰            [parent] => 3        )    [5] => Array        (            [id] => 7            [name] => 百合            [parent] => 3        )    [6] => Array        (            [id] => 8            [name] => 資源            [parent] => 0        )    [7] => Array        (            [id] => 9            [name] => app            [parent] => 8        )    [8] => Array        (            [id] => 10            [name] => 軟體            [parent] => 8        )    [9] => Array        (            [id] => 11            [name] => 黑科技            [parent] => 8        ))

其中 id 為分類唯一ID, parent 為父類ID
我寫的代碼 如下:

    function all($id=0){            static $_class = null;            if(is_null($_class))                    $_class = select();  //這個得出來的就是以上的數組結構,然後賦值給了`$_class`變數            $result = array();            foreach($_class as $k => $v){                    if($v['parent'] == $id){                            unset($_class[$k]);                            $v = array_merge($v, $this->all($v['id']));                            $result['child'][] = $v;                    }            }            return $result;    }    print_r(all(0));

unset($_class[$k]);
這一行去掉

鑒於你這個還是用的遞迴來完成的,我這裡提供2個方法,一個是遞迴的,一個是指標形態的。

第二個可能您暫時無法理解,但是為協助您學習,以及方便到他人,以下是代碼:

使用遞迴

// 呃,我真不忍心寫出這個迴圈那麼多遍的代碼,求神解救我。function _data_to_tree(&$items, $topid = 0, $with_id = TRUE){    $result = [];    foreach($items as $v)        if ($topid == $v['parent'])  {            $r = $v + ['children' => _data_to_tree($items, $v['id'], $with_id)];            if ($with_id)                $result[$v['id']] = $r;            else                $result[] = $r;        }                return $result;}

使用PHP的指標特性

function _data_to_tree($items, $topid = 0, $with_id = TRUE){    if ($with_id)        foreach ($items as $item)            $items[ $item['parent'] ]['children'][ $item['id'] ] = &$items[ $item['id'] ];    else        foreach ($items as $item)                $items[ $item['parent'] ]['children'][] = &$items[ $item['id'] ];         return isset($items[ $topid ]['children']) ? $items[ $topid ][ 'children' ] : [];}

使用

傳入你的上述數組,比如最頂層的ID為0

$data = [   ['id' => 4, 'parent' => 1 , 'text' => 'Parent1'],    ['id' => 1, 'parent' => 0 , 'text' => 'Root'],   ['id' => 2, 'parent' => 1 , 'text' => 'Parent2'],    ['id' => 3, 'parent' => 2 , 'text' => 'Sub1'], ];print_r ( _data_to_tree($data, 0) );

結果

Array(    [1] => Array        (            [id] => 1            [parent] => 0            [text] => Root            [children] => Array                (                    [4] => Array                        (                            [id] => 4                            [parent] => 1                            [text] => Parent1                            [children] => Array                                (                                )                        )                    [2] => Array                        (                            [id] => 2                            [parent] => 1                            [text] => Parent2                            [children] => Array                                (                                    [3] => Array                                        (                                            [id] => 3                                            [parent] => 2                                            [text] => Sub1                                            [children] => Array                                                (                                                )                                        )                                )                        )                )        ))
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.