Привет, у меня есть этот массив из набора данных:
Пример:
array (
1 =>
array (
'id' => '1',
'name' => ' Category',
'id_parent' => '0',
'ativo' => '1',
),
2 =>
array (
'id' => '2',
'name' => ' Slippers',
'id_parent' => '0',
'ativo' => '1',
),
3 =>
array (
'id' => '3',
'name' => ' TShirts',
'id_parent' => '0',
'ativo' => '1',
),
4 =>
array (
'id' => '4',
'name' => ' BlousesSweatshirt',
'id_parent' => '0',
'ativo' => '1',
),
5 =>
array (
'id' => '5',
'name' => ' Cap',
'id_parent' => '0',
'ativo' => '1',
),
6 =>
array (
'id' => '6',
'name' => ' Stickers',
'id_parent' => '0',
'ativo' => '1',
),
7 =>
array (
'id' => '7',
'name' => ' ScreensandFrames',
'id_parent' => '0',
'ativo' => '1',
),
8 =>
array (
'id' => '8',
'name' => ' Models',
'id_parent' => '0',
'ativo' => '1',
),
9 =>
array (
'id' => '9',
'name' => ' Notebook',
'id_parent' => '6',
'ativo' => '1',
),
10 =>
array (
'id' => '10',
'name' => ' Door',
'id_parent' => '0',
'ativo' => '1',
),
11 =>
array (
'id' => '11',
'name' => ' Door',
'id_parent' => '6',
'ativo' => '1',
),
12 =>
array (
'id' => '12',
'name' => ' Kangaroo',
'id_parent' => '4',
'ativo' => '1',
),
13 =>
array (
'id' => '13',
'name' => ' KangarooRaglan',
'id_parent' => '4',
'ativo' => '1',
),
14 =>
array (
'id' => '14',
'name' => ' RoundCollar',
'id_parent' => '4',
'ativo' => '1',
),
15 =>
array (
'id' => '15',
'name' => ' Trucker',
'id_parent' => '5',
'ativo' => '1',
),
16 =>
array (
'id' => '16',
'name' => ' Basic',
'id_parent' => '3',
'ativo' => '1',
),
17 =>
array (
'id' => '17',
'name' => ' Longline',
'id_parent' => '3',
'ativo' => '1',
),
18 =>
array (
'id' => '18',
'name' => ' Raglan',
'id_parent' => '3',
'ativo' => '1',
),
19 =>
array (
'id' => '19',
'name' => ' Raglan3/4',
'id_parent' => '3',
'ativo' => '1',
),
20 =>
array (
'id' => '20',
'name' => ' Regatta',
'id_parent' => '3',
'ativo' => '1',
),
21 =>
array (
'id' => '21',
'name' => ' Slide',
'id_parent' => '2',
'ativo' => '1',
),
22 =>
array (
'id' => '22',
'name' => ' Stickers',
'id_parent' => '8',
'ativo' => '1',
),
23 =>
array (
'id' => '23',
'name' => ' Notebook',
'id_parent' => '22',
'ativo' => '1',
),
24 =>
array (
'id' => '24',
'name' => ' T-shirt',
'id_parent' => '8',
'ativo' => '1',
),
25 =>
array (
'id' => '25',
'name' => ' Basic',
'id_parent' => '24',
'ativo' => '1',
),
26 =>
array (
'id' => '26',
'name' => ' Slippers',
'id_parent' => '8',
'ativo' => '1',
),
27 =>
array (
'id' => '27',
'name' => ' Slide',
'id_parent' => '26',
'ativo' => '1',
),
28 =>
array (
'id' => '28',
'name' => ' 1Screen',
'id_parent' => '7',
'ativo' => '1',
),
29 =>
array (
'id' => '29',
'name' => ' Set3Screens',
'id_parent' => '7',
'ativo' => '1',
),
30 =>
array (
'id' => '30',
'name' => ' Set5Screens',
'id_parent' => '7',
'ativo' => '1',
),
31 =>
array (
'id' => '31',
'name' => ' BlousesSweatshirt',
'id_parent' => '8',
'ativo' => '1',
),
32 =>
array (
'id' => '32',
'name' => ' Cap',
'id_parent' => '8',
'ativo' => '1',
),
33 =>
array (
'id' => '33',
'name' => ' ScreensandFrames',
'id_parent' => '8',
'ativo' => '1',
),
)
Принимая во внимание, что этот массив у нас есть отцы и дети,
пример:
-EX: [1] Models является отцом: стикеров, футболок, тапочек.
-EX: [2] Stickers является отцом: Notebook
Мне нужна функция для рекурсивного получения модели и всех детей (до конца):
Я уже сделал функцию для получения рекурсивных отцов из записной книжки, например:
здесь:
function returnParent($id, $haystack, $arr = null){
$needle = $haystack[$id];
$arr[] = $needle;
if ($needle['id_parent']){
return returnParent($needle['id_parent'], $haystack, $arr);
}else{
return $arr;
}
}
где $id = 23 и $haystack - это полный набор данных.
результат:
Array
(
[0] => Array
(
[id] => 23
[name] => Notebook
[id_parent] => 22
)
[1] => Array
(
[id] => 22
[name] => Stickers
[id_parent] => 8
)
[2] => Array
(
[id] => 8
[name] => models
[id_parent] => 0
)
)
Результат функции для возврата дочерних элементов должен быть таким же, как у returnParent, искомое значение должно быть в массиве как ключ 0;
полный набор данных здесь: https://pastebin.com/jgTM7aLA
предложения по улучшению моей функции очень приветствуются :)
РЕДАКТИРОВАТЬ
Ожидаемый результат:
0 =>
array (
'id' => '8',
'name' => ' Models',
'id_parent' => '0',
'ativo' => '1',
),
1 =>
array (
'id' => '6',
'name' => ' Stickers',
'id_parent' => '0',
'ativo' => '1',
),
2 =>
array (
'id' => '9',
'name' => ' Notebook',
'id_parent' => '6',
'ativo' => '1',
),
3 =>
array (
'id' => '24',
'name' => ' T-shirt',
'id_parent' => '8',
'ativo' => '1',
),
4 =>
array (
'id' => '25',
'name' => ' Basic',
'id_parent' => '24',
'ativo' => '1',
)... and ..etc
Что-то в этом роде, ключ 0 должен быть искомым значением, а другие значения не должны быть в древовидном порядке, любой порядок его нормально, пока получаются все значения.
другими словами:
получить узел массива, показать ему и всем детям и внукам.
Вы просите функцию для вывода родительского элемента, а затем его дочерних элементов в заданном формате?
@Andreas Ожидаемый результат добавлен!
@Krishanu, да.






Я считаю, что это то, что вы ищете. Я зацикливаю уникальных родителей и нахожу, какие элементы имеют соответствующего родителя. Мне пришлось добавить значение "NULL" для родителей и идентификаторов, потому что ваш массив не имеет нулевого индекса. Мне потребовалось много времени, чтобы понять ...
В любом случае возврат - это «родительский» массив и дочерние элементы ниже.
$temp = array_column($arr, "id");
$ids[0] = "NULL";
$ids = array_merge($ids, $temp);
$temp = array_column($arr, "id_parent");
$parents[0] = "NULL";
$parents = array_merge($parents, $temp);
Foreach(array_unique($parents) as $parent){
if ($parent ==0) continue; // if parent is 0 we don't need to search for it (I think)
$new[$parent]['parent'] = $arr[$parent];
$new[$parent]['children'] = array_intersect_key($arr, array_intersect($parents, [$parent]));
}
Var_dump($new);
Я очень близок к тому, что мне нужно. Я очень благодарен вам за ваши усилия, ... что мне нужно, например: модели ... тоже нужно показать внуков. .. другими словами .. все, что есть в разделе "Модели".
function returnChild($id, $haystack, $arr = []){
$needle = $haystack[$id];
array_push($arr, $needle);
foreach($haystack as $key){
if ($key['id_parent'] == $needle['id']){
array_push($arr,returnChild($key['id'], $haystack));
}
}
return $arr;
}
Надеюсь, это решение вашей проблемы!
очень близко, то, что мне нужно, но нужно вернуть: футболка и его дети Basic, тапочки и его дети Slide, блузки, толстовка, кепка, ScreensandFrames, другими словами .. все в рамках Models
посмотрите это изображение все под id 8 "modelos" paste.pics/018ae28d239f1452a01e9b2fdeda2ff1
так вы хотите, чтобы дочерний элемент был вложен в родительский?
Все потомки и внуки (и т. д.) Вложены в родительский объект.
Сообщение отредактировано, думаю, это то, о чем вы просили!
Хорошо сделано! И спасибо за решение. Это сводило меня с ума. Я работаю над этим с момента публикации вопроса. Но я думаю, что сейчас я действительно близок.
Каков ожидаемый результат?