Получите всех детей вложенного дерева рекурсивно

Спасибо всем
У меня есть вложенное дерево JSON, которое я хочу получить только идентификаторы.
Это результат моего запроса.
Моя цель — вызвать функцию recusrive и присвоить ей родительский идентификатор, и он вернет все дочерние идентификаторы.
Ps: я работаю с laravel, Eloquent

[{
"id": "1",
"name": "albert",
"children": [{
"id": "5",
"name": "George",
"children": [{
"id": "7",
"name": "Julia"}, {
"id": "9",
"name": "Harry",
"children": []
}]
}, {
"id": "2",
"name": "Richard",
"children": []
}]
}]

Я пытался сделать рекурсивную функцию, но она не работает.

function displayArrayRecursively($childrenUnit) {
foreach ($childrenUnit as $unit) {
$ids[] = $unit->id;
if ($unit->childrenUnit) {
displayArrayRecursively(Unit::find($unit->id)->childrenUnit);
} else {
return $ids;
}
}}

любая помощь

0

Решение

Кажется, это работает для меня

<?php
$jsonString = '[{
"id": "1",
"name": "albert",
"children": [{
"id": "5",
"name": "George",
"children": [{
"id": "7",
"name": "Julia"}, {
"id": "9",
"name": "Harry",
"children": []
}]
}, {
"id": "2",
"name": "Richard",
"children": []
}]
}]';

$objects = json_decode($jsonString);

function findIds($child, $ids) {
if (isset($child->children)) {
if (count($child->children) > 0) {
foreach ($child->children as $ch) {
$ids[] = $ch->id;
$ids = findIds($ch, $ids);
}
}
}

return $ids;
}

$result = array();
if (count($objects) > 0) {
$ids = array();
foreach ($objects as $object) {
$ids = findIds($object, array());
$result[] = array('id' => $object->id, 'ids' => $ids);
}
}

echo '<pre>';
print_r($result);
echo '</pre>';
1

Другие решения

Вход:

Array
(
[0] => Array
(
[name] => Query Reporting and Analytics
[id] => 598
[children] => Array
(
[605] => Array ([name] => Access query [id] => 605 )
[606] => Array ([name] => Powerful [id] => 606)
)
)
[1] => Array
(
[name] => Business Intelligence Platform
[id] => 599
[children] => Array
(
[849] => Array ([name] => Access, explore [id] => 849)
[850] => Array ([name] => Advanced reporting[id] => 850)
)
)
[2] => Array
(
[name] => Data Management
[id] => 600
)

Выход:

Array
(
[0] => 598
[1] => 605
[2] => 606
[3] => 599
[4] => 849
[5] => 850
[6] => 600
)

Проверьте следующую функцию для получения идентификаторов в дереве.

function findTreeIds($tree, $ids = array(), $colName = 'id', $childColName = 'children')
{
foreach ($tree as $element) {
if (!isset($element[$colName])) {
continue;
}
$ids[] = $element[$colName];

if (isset($element[$childColName]) && count($element[$childColName]) > 0) {
$ids = static::findTreeIds($element[$childColName], $ids, $colName, $childColName);
}
}
return $ids;
}
0

По вопросам рекламы [email protected]