无限分类、找所有上级、所有子类…..这些都是无限分类。小编恰好,这两年都跟相关内容打交道,故总结了一点方法。
- 有如下结构的数据:
// id 为主键
// pid 为父级的id
$a = [
['id'=>1, 'pid'=>0, 'name'=>'a1'],
['id'=>2, 'pid'=>1, 'name'=>'a2'],
['id'=>3, 'pid'=>2, 'name'=>'a3'],
['id'=>4, 'pid'=>3, 'name'=>'a4'],
['id'=>5, 'pid'=>4, 'name'=>'a5'],
['id'=>6, 'pid'=>5, 'name'=>'a6'],
];
如何查找’a3’所有的下级
// 函数定义(在类中自己修改)
/**
* 递归的实线
* @author Tom
*
* @param array $array 需要递归的数组
* @param int $topId 顶级的id
* @param int $lev 定义层级
*/
function getLower($array, $topId, $lev = 0) {
$result = [];
foreach ($array as $key => $value) {
if ($value['pid'] == $topId) {
$value['lev'] = $lev; // 定义层级
$result[] = $value;
$result = array_merge($result, getLower($array, $value['id'], $lev + 1));
}
}
return $result;
}
$result = getLower($a, 3, 0);
// 结果如下
/**
array(
array('id'=>4, ....,'lev'=>0)
array('id'=>5, ....,'lev'=>1)
array('id'=>6, ....,'lev'=>2)
);
*/
变种方法
// 查询下级的所有主键
function getLowerId($array, $topId)
{
$result = [];
foreach ($array as $key => $value) {
if ($value['h'] == $topId) {
$result[] = $value['id'];
$result = array_merge($result, getLower($array, $value['id']));
}
}
return $result;
}
数据库的设计
有上下级关系时,建议用户表分两张,其中一张为主用户表(如users,含id,name,age等多个字段),包含的是所有的详细信息;另一张是附表(users_layer),只存上下级(三个字段足矣,主键id,userid,pid)
使用:
- 查询出users_layer中所有的信息;
- 根据指定的id,查询所有下级的id;
- 根据id使用in方法查询数据库指定的用户信息。
这样不仅能递归,也能减少数据库的查询。