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