无限极分类

无限极分类

有个数组 $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();

本文章首发在 Laravel China 社区

NOT IS BECAUSE I WANT TO WRITE,
BUT I WANT TO INCREASE,
SO I GO TO WRITE~~