Как можно сгладить этот набор результатов, чтобы родители и дети были на одном уровне?
Я пытаюсь сгладить этот массив так, чтобы дочерний элемент был на том же уровне, что и родительский. Я пробовал решения других вопросов Stackru, таких как этот и этот, но безрезультатно. Есть идеи?
(int) 3 => object() {
"new" => false,
"properties" => [
"id" => (int) 180,
"name" => "Herp de Derp",
"parent_id" => (int) 169,
"lft" => (int) 16,
"rght" => (int) 19,
"children" => [
(int) 0 => object(App\Model\Entity\Team) {
"new" => false,
"properties" => [
"id" => (int) 188,
"name" => "dood dood",
"parent_id" => (int) 180,
"lft" => (int) 17,
"rght" => (int) 18,
"children" => []
],
"repository" => "Teams"
}
]
],
"repository" => "Teams"
},
Это должно работать для внуков, правнуков и т. Д., А не только для родителей и одного ребенка.
2 ответа
В конечном счете, если вы хотите сгладить это с неизвестной глубины дерева, вам нужна рекурсия. Я смоделировал немного более обширный пример вашего образца объекта в файле ("test.json"):
{
"new": false,
"properties": {
"children": [
{
"new": false,
"properties": {
"children": [],
"id": 188,
"lft": 17,
"name": "dood dood",
"parent_id": 180,
"rght": 18
},
"repository": "Teams"
},
{
"new": false,
"properties": {
"children": [],
"id": 182
},
"repository": "Teams"
}
],
"id": 180,
"lft": 16,
"name": "Herp de Derp",
"parent_id": 169,
"rght": 19
},
"repository": "Teams"
}
Пример программы, которую я создал в PHP для перечисления, показан ниже:
<?php
// $x is the JSON representation of this object (quick for scaffolding purposes)
// $y is the object representation
$x = file_get_contents("test.json");
$y = json_decode($x);
// $memo is our final product, an array that is written to as we traverse the object's children
$memo = [];
// Using recursive closure to walk the object/children and append to $memo
$z = function($n) use (&$z, &$memo) {
// Build clone $o (sans children) of $n:
$o = new stdClass;
$o->new = $n->new;
$o->repository = $n->repository;
$o->properties = [];
$children = [];
foreach($n->properties as $k => $v) {
if($k == "children") {
// Do children afterward, to ensure current object
// appears in array before children
$children = $v;
continue;
} else {
$o->properties[$k] = $v;
}
}
array_push($memo, $o);
array_walk($children, $z);
};
$z($y);
print_r($memo);
$z
моя рекурсивная функция, которую я выбрал для реализации из предпочтения. Я начинаю с выделения пустого массива ($memo
), который затем заполняется, сначала добавляя текущий объект, затем добавляя потомки объекта после факта. Когда он пересекает дочерние элементы, рекурсивная функция вызывает себя для своих дочерних элементов и т. Д. По мере необходимости.
С учетом вышеизложенного мой вывод выглядит так:
Array
(
[0] => stdClass Object
(
[new] =>
[repository] => Teams
[properties] => Array
(
[id] => 180
[name] => Herp de Derp
[parent_id] => 169
[lft] => 16
[rght] => 19
)
)
[1] => stdClass Object
(
[new] =>
[repository] => Teams
[properties] => Array
(
[id] => 188
[name] => dood dood
[parent_id] => 180
[lft] => 17
[rght] => 18
)
)
[2] => stdClass Object
(
[new] =>
[repository] => Teams
[properties] => Array
(
[id] => 182
)
)
)
То, что вы хотите, это преобразовать объект в массив:
$arr = (array) $obj;
Для объекта json, используя json_decode:
$arr = json_decode(json_encode($obj), true);