PHP implementation of infinite Polar classification

Source: Internet
Author: User
Tags foreach array key

Use two for loops to implement an infinite class classification

Table:

Field name field Type Notes Default Value
Id Int Primary KEY Auto-increment
Name varchar Category name
Pid Int Parent class ID 0

the PID of the top level classification is 0 by default . When we want to take out a subcategory of a classification tree, the basic idea is recursion , of course, for efficiency issues do not recommend each recursive query database , the usual practice is to remove all the categories, the data stored in the PHP array, and then processed , you can finally cache the results to increase the efficiency of the next request.

First, build an original array , which is queried directly from the database:

1. Building Data

$categories = array(
    array('id'=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

The goal is to convert it into the following structure
Computers > Notebooks >> Super Ben >> game ben > Desktop
Mobile > Smart machine > Function Machine

With an array, you can add a children key to store its subcategories :

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

2. Processing process:

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

3. The printed results are as follows:

Array ([1] => array ([ID] => 1 [name] => computer [PID] => 0
                            [Children] => Array ([0] => Array (
                            [ID] => 3 [name] => notebook [pid] => 1 [Children] => Array ([0] =&G T
                                            Array ([id] => 7
                                            [Name] => super [PID] => 3
                                                [Children] => Array (
                        )) [1] => Array                ([ID] => 8 [NA Me] => game [PID] => 3 [child
                                        Ren] => Array () )) [1] = 
                            > Array ([id] => 4 [name] => desktop
                                [PID] => 1 [children] => Array
        ())) [2] => Array
                ([id] => 2 [name] => mobile [PID] => 0 [children] => Array
            (        [0] => Array ([id] => 5 [NA
                                Me] => smart machine [PID] => 2 [children] => Array
                        ()) [1] => Array
                            ([ID] => 6 [name] => function machine
                                [PID] => 2 [children] => Array (  )) [3] => Array ([id]
                    => 3 [name] => notebook [pid] => 1 [children] => Array (
                            [0] => Array ([id] => 7
   [Name] => super Ben                         [PID] => 3 [children] => Array
                        ()) [1] => Array ([ID] => 8 [name] => game [PID]
                                => 3 [Children] => Array (
            ))) [4] => Array ([id] => 4
        [Name] => desktop [PID] => 1 [children] => Array ()
            ) [5] => Array ([id] => 5 [name] => smart machine [PID] => 2 [Children] => Array ()) [6] => array ([ID] => 6 [NamE] => function machine [PID] => 2 [children] => Array ()) [7] => Array ([id] => 7 [name] => super [PID] => 3 [C
            Hildren] => Array ()) [8] => array ([ID] => 8
                [Name] => game [PID] => 3 [children] => Array ( )
        )
)

Advantages: Clear relationship, modify the relationship between the superior and subordinate is simple.

Disadvantages: use PHP processing, if the number of large categories, efficiency will also be reduced.



Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.