検索
ホームページphp教程php手册PHP实现无限极分类

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处理,如果分类数量庞大,效率也会降低。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません