cari

PHP实现无限极分类

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

表:

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

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

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

1. 构建数据

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

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

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

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

2. 处理过程:

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

3. 打印结果如下:

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

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

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

原文 http://blog.csdn.net/u013927110/article/details/44086253

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Terangkan bagaimana pengimbangan beban mempengaruhi pengurusan sesi dan bagaimana mengatasinya.Terangkan bagaimana pengimbangan beban mempengaruhi pengurusan sesi dan bagaimana mengatasinya.Apr 29, 2025 am 12:42 AM

Beban mengimbangi mempengaruhi pengurusan sesi, tetapi dapat diselesaikan dengan replikasi sesi, ketegangan sesi, dan penyimpanan sesi berpusat. 1. Sesi Replikasi Salinan Data Sesi Antara Pelayan. 2. Sesi Stickiness mengarahkan permintaan pengguna ke pelayan yang sama. 3. Penyimpanan Sesi Pusat menggunakan pelayan bebas seperti Redis untuk menyimpan data sesi untuk memastikan perkongsian data.

Terangkan konsep penguncian sesi.Terangkan konsep penguncian sesi.Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauserererersessionremainsexclusivetooneuseratatime.IScrucialFreventingDataCorruptionSandsecuritybreachesinmulti-userapplications.SessionLockingISimplementedusingserverververveChan

Adakah terdapat alternatif untuk sesi PHP?Adakah terdapat alternatif untuk sesi PHP?Apr 29, 2025 am 12:36 AM

Alternatif untuk sesi PHP termasuk kuki, pengesahan berasaskan token, sesi berasaskan pangkalan data, dan redis/memcached. 1.Cookies Menguruskan sesi dengan menyimpan data pada klien, yang mudah tetapi rendah dalam keselamatan. 2. Pengesahan berasaskan token menggunakan token untuk mengesahkan pengguna, yang sangat selamat tetapi memerlukan logik tambahan. 3.Database-berasaskan data menyimpan data dalam pangkalan data, yang mempunyai skalabilitas yang baik tetapi boleh menjejaskan prestasi. 4. Redis/Memcached menggunakan cache yang diedarkan untuk meningkatkan prestasi dan skalabiliti, tetapi memerlukan pemadanan tambahan

Tentukan istilah 'sesi rampasan' dalam konteks PHP.Tentukan istilah 'sesi rampasan' dalam konteks PHP.Apr 29, 2025 am 12:33 AM

SessionHijacking merujuk kepada penyerang yang menyamar sebagai pengguna dengan mendapatkan sessionId pengguna. Kaedah pencegahan termasuk: 1) menyulitkan komunikasi menggunakan HTTPS; 2) mengesahkan sumber sessionId; 3) menggunakan algoritma generasi sesi yang selamat; 4) Secara kerap mengemas kini sessionId.

Apakah bentuk penuh PHP?Apakah bentuk penuh PHP?Apr 28, 2025 pm 04:58 PM

Artikel ini membincangkan PHP, memperincikan bentuk penuhnya, kegunaan utama dalam pembangunan web, perbandingan dengan Python dan Java, dan kemudahan pembelajarannya untuk pemula.

Bagaimanakah PHP mengendalikan data borang?Bagaimanakah PHP mengendalikan data borang?Apr 28, 2025 pm 04:57 PM

PHP mengendalikan data borang menggunakan $ \ _ post dan $ \ _ mendapatkan superglobals, dengan keselamatan memastikan melalui pengesahan, sanitisasi, dan interaksi pangkalan data yang selamat.

Apakah perbezaan antara PHP dan ASP.NET?Apakah perbezaan antara PHP dan ASP.NET?Apr 28, 2025 pm 04:56 PM

Artikel ini membandingkan PHP dan ASP.NET, memberi tumpuan kepada kesesuaian mereka untuk aplikasi web berskala besar, perbezaan prestasi, dan ciri keselamatan. Kedua-duanya berdaya maju untuk projek besar, tetapi PHP adalah sumber terbuka dan bebas platform, sementara ASP.NET,

Adakah PHP adalah bahasa sensitif kes?Adakah PHP adalah bahasa sensitif kes?Apr 28, 2025 pm 04:55 PM

Kepekaan kes PHP berbeza -beza: Fungsi tidak sensitif, manakala pembolehubah dan kelas sensitif. Amalan terbaik termasuk penamaan yang konsisten dan menggunakan fungsi kes-insensitif untuk perbandingan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.