【发布时间】:2021-02-02 10:39:20
【问题描述】:
从昨天开始,我一直被困在这个问题上,任何帮助都将不胜感激。情况是这样的:我有一个具有以下结构的导航链接表, 编号 | parent_id |文字
在我的场景中,parent_id 可能为 null(无子菜单)或任何指向表的 id,这将使记录成为父级的子菜单。我尝试了许多不同的方法来执行此操作,但没有运气,我想出的最接近的方案如下,
// All navigation link results are stored in $data
public static function transform(array &$data) {
$result = [];
$search = function(&$array = [], $parent = null) use (&$search, &$result){
foreach($array as $key => $value) {
/** If the element has an ancestor */
if($parent && $parent->id == $value->parent_id) {
$next = $parent->children[] = $value;
$search($array, $next);
unset($array[$key]);
}
}
return $parent;
};
foreach($data as $val) {
$result[] = $search($data, $val);
}
return $result;
}
该函数工作正常并跟踪某个链接的所有祖先,但在下一次迭代中跟踪下一个元素的所有祖先(即使它是前一个元素的子元素),因此它返回了很多重复的数据。我想出了从数组中取消设置迭代元素的解决方案,但由于某种原因,该元素仍在下一次迭代中使用。 Here is my current data
【问题讨论】:
-
它可能只需要在递归位之前有
unset($array[$key]);(所以在$search($array, $next);之前移动它) -
返回的结果完全相同。
标签: php recursion multidimensional-array