我正在尝试制作并保存一个项目树,其中一个项目可以是另一个项目的子项.但这个孩子也可以有孩子等等.所以例如我得到一个像:
array(
[0] array(
'id' => 100
),
[1] array(
'id' => 101,
'children' => array(
[0] array(
'id' => 103
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
或者作为JSON:
[{"id":1},{"id":3,"children":[{"id":4},{"id":5},{"id":6}]},{"id":2},{"id":7,"children":[{"id":8},{"id":9}]},{"id":10,"children":[{"id":11},{"id":12}]}][{"id":1},{"id":3,"children":[{"id":4},{"id":5},{"id":6}]},{"id":2},{"id":7,"children":[{"id":8},{"id":9}]},{"id":10,"children":[{"id":11},{"id":12}]}]
Run Code Online (Sandbox Code Playgroud)
使用下面的代码,我可以深入一级找到孩子并执行一个动作.当然我可以添加另一个如果有孩子,但这意味着很多if和foreach语句到达数组的底部.特别是据我所知,有时孩子们在练习中可以达到10级.
public function sortPages(Request $request) {
$data = json_decode($request->data);
foreach($data as $sort=>$id) {
$this->saveSortingOrder($id->id, $sort);
if(isset($id->children)) {
foreach($id->children as $sort_next=>$id_next) {
$this->saveSortingOrder($id_next->id, $sort_next);
$this->setParent($id_next->id, $id->id);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来完成工作?
使用以下代码修复它:
public function sortPages(Request $request) {
$data = json_decode($request->data);
foreach($data as $sort_value=>$id) {
$this->saveSortingOrder($id->id, $sort_value);
if(isset($request->parent)) {
$this->setParent($id->id, $request->parent);
}
if(isset($id->children)) {
$new_request = new Request;
$new_request->data = json_encode($id->children);
$new_request->parent = $id->id;
$this->sortPages($new_request);
}
}
}
Run Code Online (Sandbox Code Playgroud)
递归会很有帮助。这是一个例子:
private function checkArrayRecursively($arr)
{
if ($arr) {
foreach ($arr as $value) {
if (is_array($value)) {
// do something
checkArrayRecursively($value);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)