PHP Laravel-foreach只循环一次



我有一个类别表,其中有parent_id列,指的是父类别的id。我需要检索某个类别下的所有id(它的所有子项和孙项(。我写了这个递归函数,但由于某种原因,它只返回给定类别id的直接子项。

我在这里错过了什么?

function subCategoriesList($id, $data=[]){
$children = Category::whereParentId($id)->get();
foreach ($children as $child){
$data[] = $child->id;
subCategoriesList($child->id, $data);
}
return $data;
}

您不是通过引用传递$data,而是像这样进行递归调用。

尝试:

function subCategoriesList($id){
$data=[]
$children = Category::whereParentId($id)->get();
foreach ($children as $child){
$data[] = $child->id;
$data = array_merge($data, subCategoriesList($child->id));
}
return $data;
}

相反,为了完整性,参考文献:

function subCategoriesList($id, &$data){
$children = Category::whereParentId($id)->get();
foreach ($children as $child){
$data[] = $child->id;
subCategoriesList($child->id, $data);
}
}
// You must call it as follows, though
$my_data = [];
subCategoriesList($some_id, $my_data);

不过,就我个人而言,我倾向于建议避免引用,除非有明确的理由。IMO——它们往往会导致代码混乱和副作用,而很少能带来作者认为的好处。

当您在函数中调用subCategoriesList时,您不会对returndata执行任何操作。

subCategoriesList($child->id, $data);

应该是

$data = array_merge($data, subCategoriesList($child->id, $data));

最新更新