首頁  >  文章  >  後端開發  >  PHP無限分類 程式碼問題

PHP無限分類 程式碼問題

WBOY
WBOY原創
2016-09-27 14:18:10839瀏覽

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

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


數組結構如下:

<code>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
        )

)</code>

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

<code>
    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));</code>

回覆內容:

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

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


數組結構如下:

<code>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
        )

)</code>

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

<code>
    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));</code>

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

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

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

使用遞迴

<code>// 呃,我真不忍心写出这个循环那么多遍的代码,求神解救我。

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;
}
</code>

使用PHP的指標特性

<code>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' ] : [];
}</code>

使用

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

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

</code>

結果

<code>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
                                                (
                                                )
                                        )
                                )
                        )
                )
        )
)</code>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn