如何解决如何以递归方式将一个数组添加为另一个数组的子级?
我需要建立具有父子关系的对象树。我的对象有一个parent_id。
public function index()
{
$root = Project::find($_POST['project_id']);
$tree = array('name' => $root->name,'children' => array());
$this->addChildren($tree,$root->id);
return response()->json(json_encode($tree));
}
我调用一个递归函数 addChildren()从关系数据库中构建树层次结构。
private function addChildren($object,$parent_id,$project_id)
{
$criterias = Criteria::where([['project_id','=',$project_id],['parent_id',$parent_id]])->get();
foreach($criterias as $criteria) {
$item = array('name' => $criteria->name,'children' => array());
array_push($object['children'],$item);
if($criteria->has_child)
$this->addChildren($item,$criteria->id,$criteria->project_id);
}
}
但是,当我运行此命令时,除了递归 addChildren()函数之外对其进行的初始输入, $ tree 对象均返回空值:
{name: "Test Project",children: Array(0)}
。
我尝试将两者都推到 $ object ['children']
array_push($object['children'],$item);
和
$object['children'][] = $item;
具有相同的结果。
我知道数据库调用工作正常,因为在Laravel调试栏中,我可以看到对数据库的查询与所有应返回的ID匹配。
解决方法
我在Felippe Duarte的评论的帮助下进行了修复。在函数中添加返回值并将其设置为数组即可达到目的。
$tree['children'] = $this->addChildren(0,$root->id);
和
private function addChildren($parent_id,$project_id)
{
$criterias = Criteria::where([['project_id','=',$project_id],['parent_id',$parent_id]])->get();
$children = [];
foreach($criterias as $criteria) {
$item = array('name' => $criteria->name,'children' => array());
if($criteria->has_child) {
$item['children'] = $this->addChildren($criteria->id,$criteria->project_id);
}
array_push($children,$item);
}
return $children;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。