無限極分類

jcc123發表於2018-05-25

無限極分類

有個陣列 $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 協議》,轉載必須註明作者和本文連結

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

相關文章