PHP无限级分类 代码问题

WBOY
Freigeben: 2016-09-27 14:18:10
Original
845 Leute haben es durchsucht

自己试着写了个无限级分类的,结果有些问题,想了很长时间了,感觉代码没问题呀,可就是结果不正确。现在整个人都懵了....

网上的栗子看了些,貌似写法跟我的不一样。


数组结构如下:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

其中 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>
Nach dem Login kopieren
Nach dem Login kopieren

回复内容:

自己试着写了个无限级分类的,结果有些问题,想了很长时间了,感觉代码没问题呀,可就是结果不正确。现在整个人都懵了....

网上的栗子看了些,貌似写法跟我的不一样。


数组结构如下:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

其中 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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

使用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>
Nach dem Login kopieren

使用

传入你的上述数组,比如最顶层的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>
Nach dem Login kopieren

结果

<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>
Nach dem Login kopieren
Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!