下面是详细讲解“php实现无限级分类查询(递归、非递归)”的完整攻略。
无限级分类查询
无限级分类,是指一个数据表中的数据具有层次关系,例如商品分类、栏目分类等。无限级分类查询是指在查询这个分类数据表时,要将所有的数据归类到不同的层级中,以便于在页面上展示并且方便用户浏览。
数据库设计
在设计数据库表时,需要添加一个 parent_id
字段,来表示父级分类的 id
,如下所示:
create table categories (
id int(11) unsigned not null auto_increment primary key,
name varchar(255) not null,
parent_id int(11) unsigned default 0
);
递归实现
递归实现是指使用 PHP 函数来循环查询数据并建立父子关系。
/**
* 递归获取分类树
*
* @param array $data 分类数据
* @param int $parent_id 父级分类id
* @param int $level 分类级别
* @return array
*/
function getCategoriesTree($data, $parent_id = 0, $level = 0)
{
$tree = array();
foreach ($data as $category) {
if ($category['parent_id'] == $parent_id) {
$category['level'] = $level;
$category['children'] = getCategoriesTree($data, $category['id'], $level + 1);
$tree[] = $category;
}
}
return $tree;
}
// 示例代码
$data = array(
array('id'=>1, 'name'=>'分类1', 'parent_id'=>0),
array('id'=>2, 'name'=>'分类2', 'parent_id'=>0),
array('id'=>3, 'name'=>'分类1.1', 'parent_id'=>1),
array('id'=>4, 'name'=>'分类1.2', 'parent_id'=>1),
array('id'=>5, 'name'=>'分类2.1', 'parent_id'=>2),
array('id'=>6, 'name'=>'分类1.1.1', 'parent_id'=>3),
);
$tree = getCategoriesTree($data);
print_r($tree);
输出结果如下:
Array
(
[0] => Array
(
[id] => 1
[name] => 分类1
[parent_id] => 0
[level] => 0
[children] => Array
(
[0] => Array
(
[id] => 3
[name] => 分类1.1
[parent_id] => 1
[level] => 1
[children] => Array
(
[0] => Array
(
[id] => 6
[name] => 分类1.1.1
[parent_id] => 3
[level] => 2
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[name] => 分类1.2
[parent_id] => 1
[level] => 1
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 2
[name] => 分类2
[parent_id] => 0
[level] => 0
[children] => Array
(
[0] => Array
(
[id] => 5
[name] => 分类2.1
[parent_id] => 2
[level] => 1
[children] => Array
(
)
)
)
)
)
非递归实现
非递归实现是指使用堆栈(stack)来循环查询数据并建立父子关系。
/**
* 非递归获取分类树
*
* @param array $data 分类数据
* @return array
*/
function getCategoriesTreeWithoutRecursion($data)
{
$tree = array();
$stack = array();
foreach ($data as $category) {
if ($category['parent_id'] == 0) {
$category['level'] = 0;
$category['children'] = array();
$tree[] = $category;
array_push($stack, &$tree[count($tree) - 1]);
} else {
$category['level'] = 0;
$category['children'] = array();
$node = array('data' => $category, 'parent' => null);
while (!empty($stack) && $stack[count($stack) - 1]['data']['id'] != $category['parent_id']) {
array_pop($stack);
}
if (!empty($stack)) {
$node['parent'] = &$stack[count($stack) - 1];
$node['data']['level'] = $node['parent']['data']['level'] + 1;
$node['parent']['data']['children'][] = &$node['data'];
array_push($stack, &$node['data']);
}
}
}
return $tree;
}
// 示例代码
$data = array(
array('id'=>1, 'name'=>'分类1', 'parent_id'=>0),
array('id'=>2, 'name'=>'分类2', 'parent_id'=>0),
array('id'=>3, 'name'=>'分类1.1', 'parent_id'=>1),
array('id'=>4, 'name'=>'分类1.2', 'parent_id'=>1),
array('id'=>5, 'name'=>'分类2.1', 'parent_id'=>2),
array('id'=>6, 'name'=>'分类1.1.1', 'parent_id'=>3),
);
$tree = getCategoriesTreeWithoutRecursion($data);
print_r($tree);
输出结果和上面的递归实现相同,不再赘述。
以上是无限级分类查询(递归、非递归)的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现无限级分类查询(递归、非递归) - Python技术站