Я пытаюсь сгладить этот массив так, чтобы дочерний элемент был на том же уровне, что и родительский. Я пробовал решения из других вопросов StackOverflow, таких как этот а также этот, но безрезультатно. Есть идеи?
(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"},
Это должно работать для внуков, правнуков и т. Д., А не только для родителей и одного ребенка.
В конечном счете, если вы хотите сгладить это с неизвестной глубины дерева, вам нужна рекурсия. Я смоделировал немного более обширный пример вашего образца объекта в файле («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);