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.