PHP Array GET родитель и потомок

Привет, у меня есть этот массив из набора данных:

Пример:

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 21.07.2018 17:10

Вы просите функцию для вывода родительского элемента, а затем его дочерних элементов в заданном формате?

Krishanu 21.07.2018 17:20

@Andreas Ожидаемый результат добавлен!

sealabr 21.07.2018 18:18

@Krishanu, да.

sealabr 21.07.2018 18:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
807
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что это то, что вы ищете. Я зацикливаю уникальных родителей и нахожу, какие элементы имеют соответствующего родителя. Мне пришлось добавить значение "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);

https://3v4l.org/Fbet4

Я очень близок к тому, что мне нужно. Я очень благодарен вам за ваши усилия, ... что мне нужно, например: модели ... тоже нужно показать внуков. .. другими словами .. все, что есть в разделе "Модели".

sealabr 21.07.2018 18:26
Ответ принят как подходящий
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

sealabr 21.07.2018 20:07

посмотрите это изображение все под id 8 "modelos" paste.pics/018ae28d239f1452a01e9b2fdeda2ff1

sealabr 21.07.2018 20:09

так вы хотите, чтобы дочерний элемент был вложен в родительский?

Krishanu 21.07.2018 20:15

Все потомки и внуки (и т. д.) Вложены в родительский объект.

sealabr 21.07.2018 20:20

Сообщение отредактировано, думаю, это то, о чем вы просили!

Krishanu 21.07.2018 20:33

Хорошо сделано! И спасибо за решение. Это сводило меня с ума. Я работаю над этим с момента публикации вопроса. Но я думаю, что сейчас я действительно близок.

Andreas 21.07.2018 21:25

Другие вопросы по теме