Home >Backend Development >PHP Tutorial >PHP implements infinite classification_PHP tutorial

PHP implements infinite classification_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 09:45:551106browse

PHP implements infinite classification

Use two for loops to achieve infinite classification

Table:

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

The default pid of the top category is 0. When we want to take out the sub-category tree of a certain category, the basic idea is recursion . Of course, due to efficiency issues it is not recommended to query the database for every recursion. The usual approach is First take out all categories, save the data into a PHP array, and then process . Finally, you can cache the results to improve the efficiency of the next request.

First let's build an original array , which can be queried directly from the database:

1. Construct data

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

The goal is to convert it into the following structure
Computers >Notebooks >>Ultrabooks >> Gaming notebooks > Desktops
Mobile phones > Smartphones > Function phones

If represented by an array, you can add a children key to store its subcategories :

<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. Processing process:

<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. The print result is as follows:

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

Advantages: The relationship is clear and it is easy to modify the relationship between superiors and subordinates.

Disadvantages: Using PHP processing, if the number of categories is huge, the efficiency will also be reduced.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1036922.htmlTechArticlePHP implements infinite classification using two for loops to implement infinite classification table: Field name Field type Remarks Default value id int primary key auto-increment name varchar classification name pid int parent class...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn