Maison >php教程 >php手册 >PHP实现无限极分类

PHP实现无限极分类

WBOY
WBOYoriginal
2016-06-13 08:57:261062parcourir

PHP实现无限极分类

利用两个for循环实现无限级分类

表:

字段名 字段类型 备注 默认值
id int 主键 auto-increment  
name varchar 分类名称  
pid int 父类id 0

顶级分类的 pid 默认就是0了。当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先将所有分类取出来,数据保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率。

先来构建一个原始数组,这个直接从数据库中查询出来就行:

1. 构建数据

<code class="hljs php">$categories = array(
    array(&#39;id&#39;=>1,&#39;name&#39;=>&#39;电脑&#39;,&#39;pid&#39;=>0),
    array(&#39;id&#39;=>2,&#39;name&#39;=>&#39;手机&#39;,&#39;pid&#39;=>0),
    array(&#39;id&#39;=>3,&#39;name&#39;=>&#39;笔记本&#39;,&#39;pid&#39;=>1),
    array(&#39;id&#39;=>4,&#39;name&#39;=>&#39;台式机&#39;,&#39;pid&#39;=>1),
    array(&#39;id&#39;=>5,&#39;name&#39;=>&#39;智能机&#39;,&#39;pid&#39;=>2),
    array(&#39;id&#39;=>6,&#39;name&#39;=>&#39;功能机&#39;,&#39;pid&#39;=>2),
    array(&#39;id&#39;=>7,&#39;name&#39;=>&#39;超级本&#39;,&#39;pid&#39;=>3),
    array(&#39;id&#39;=>8,&#39;name&#39;=>&#39;游戏本&#39;,&#39;pid&#39;=>3),
);</code>

目标是将它转化为下面这种结构
电脑 >笔记本 >>超级本 >> 游戏本 > 台式机
手机 > 智能机 > 功能机

用数组来表示的话,可以增加一个 children 键来存储它的子分类

<code class="hljs php">array(
    //1对应$categories中的id ,方便直接读取
    1 => array(
        &#39;id&#39;=>1,
        &#39;name&#39;=>&#39;电脑&#39;,
        &#39;pid&#39;=>0,
        children=>array(
            &array(
                &#39;id&#39;=>3,
                &#39;name&#39;=>&#39;笔记本&#39;,
                &#39;pid&#39;=>1,
                &#39;children&#39;=>array(
                    //此处省略
                )
            ),
            &array(
                &#39;id&#39;=>4,
                &#39;name&#39;=>&#39;台式机&#39;,
                &#39;pid&#39;=>1,
                &#39;children&#39;=>array(
                    //此处省略
                )
            ),
        )
    ),
    //其他分类省略
)</code>

2. 处理过程:

<code class="hljs php">$tree = array();
//第一步,将所有的分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category[&#39;id&#39;]] = $category;
    $tree[$category[&#39;id&#39;]][&#39;children&#39;] = array();
}
//第二步,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $key=>$value) {
    if ($value[&#39;pid&#39;] != 0) {
        $tree[$value[&#39;pid&#39;]][&#39;children&#39;][] = &$tree[$key];
    }
}
print_r($tree);</code>
<code>注:必须通过引用, 否则不会一次遍历就生成最终的结果.
</code>

3. 打印结果如下:

<code class="hljs php">Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 电脑
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 笔记本
                            [pid] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 7
                                            [name] => 超级本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 8
                                            [name] => 游戏本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 4
                            [name] => 台式机
                            [pid] => 1
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [2] => Array
        (
            [id] => 2
            [name] => 手机
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 智能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 6
                            [name] => 功能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [3] => Array
        (
            [id] => 3
            [name] => 笔记本
            [pid] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 超级本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 8
                            [name] => 游戏本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [4] => Array
        (
            [id] => 4
            [name] => 台式机
            [pid] => 1
            [children] => Array
                (
                )
        )
    [5] => Array
        (
            [id] => 5
            [name] => 智能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [6] => Array
        (
            [id] => 6
            [name] => 功能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [7] => Array
        (
            [id] => 7
            [name] => 超级本
            [pid] => 3
            [children] => Array
                (
                )
        )
    [8] => Array
        (
            [id] => 8
            [name] => 游戏本
            [pid] => 3
            [children] => Array
                (
                )
        )
)</code>

优点:关系清楚,修改上下级关系简单。

缺点:使用PHP处理,如果分类数量庞大,效率也会降低。

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn