无限极分类
无限极分类
有个数组 $arrs
类似于这样的结构
$arrs = [
[
'id'=>1,
'parent_id'=>0
],
[
'id'=>2,
'parent_id'=>1
],
[
'id'=>3,
'parent_id'=>2
],
[
'id'=>4,
'parent_id'=>0
],
[
'id'=>5,
'parent_id'=>0
],
];
想要获得 id=1
下的所有儿子,及儿子的儿子。
定义一个获取儿子的函数
function children($id,$arrs){
$result =[];
foreach ($arrs as $v){
if($id==$v['parent_id']){
$result[]=$v;
}
}
return $result;
}
这个只能返回所有儿子,儿子的儿子获取不到
对上面的儿子在调用一次,就获取到儿子的儿子,在对儿子的儿子的儿子调用一次。。。
所以用到了递归的思想
function allChildren($id,$arrs){
$result = [];
$children = children($id,$arrs);//获取儿子数组
foreach($children as $k=>$child){
$result[$k]=$child;
$childResult = allChildren($child['id'],$arrs);//获取儿子的儿子的儿子无穷尽也
foreach ($childResult as $subChild) {
$child['children'][]=$subChild;
$result[$k] = $child;
}
}
return $result;
}
print_r(allChildren(1,$arrs))
Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 3
[parent_id] => 2
)
)
)
)
映射到数据库中可以实现上面的两个相对应的方法。
在laravel中就方便的多了,只需添加两个方法
//实现类似于children($id,$arrs)方法
public function children(){
return $this->hasMany(get_class($this),'parent_id');
}
//实现了上面的allChildren($id,$arrs)方法
public function getAllChildren()
{
$result = [];
$children = $this->children;
foreach ($children as $child) {
$result[] = $child;
$childResult = $child->getAllChildren();
foreach ($childResult as $subChild) {
$result[] = $subChild;
}
}
return $result;
}
测试
Model::find(1)->getAllChildren();
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: