как я могу преобразовать массив во вложенный массив в php - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть функция в моем проекте, которая возвращает массив, подобный этому

array (size=6)
  0 => 
    array (size=4)
      'id' => string '1' (length=1)
      'user_id' => string '1' (length=1)
      'parent_id' => string '0' (length=1)
      'name' => string 'jack' (length=4)
  1 => 
    array (size=4)
      'id' => string '2' (length=1)
      'user_id' => string '6' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string 'jill' (length=4)
  2 => 
    array (size=4)
      'id' => string '3' (length=1)
      'user_id' => string '7' (length=1)
      'parent_id' => string '2' (length=1)
      'name' => string 'mary' (length=4)
  3 => 
    array (size=4)
      'id' => string '4' (length=1)
      'user_id' => string '2' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string 'scriptfloor' (length=11)

Я хотел бы преобразовать это во вложенный массив на основе родительского идентификатора в этот

{
  "id": "1",
  "user_id": "1",
  "parent_id": "0",
  "name": "jack",
  "children": [
    {
      "id": "2",
      "user_id": "6",
      "parent_id": "1",
      "name": "jill"
    },
    {
      "id": "4",
      "user_id": "2",
      "parent_id": "1",
      "name": "scriptfloor"
    },
    {
      "id": "6",
      "user_id": "3",
      "parent_id": "1",
      "name": "silas"
    }
  ]
}

Пока я поднялся только на один вложенный уровень. Я хотел бы иметь возможность сделать многомерный массив из n-уровней. Мне это нужно для построения древовидной иерархии пользователей и пользователей, которые их направили. Любая помощь будет оценена

Я использовал эту функцию, где $ items - несортированный массив

for ( $count = 0; $count < count( $items ); $count ++ ) {
    if ( count( $items[ $count ] ) > 0 ) {
        foreach ( $items[ $count ] as $itm ) {
            if ( $itm['parent_id'] == $tree['user_id'] ) {
                $tree['children'][] = $itm;
            }

        }

    }

}

1 Ответ

0 голосов
/ 14 февраля 2020

Эта проблема показывает много вещей на данный момент (ссылочная переменная, удаление элемента из массива, структура массива, инструкция продолжения, ...).

В качестве обходного пути ниже, я советую вам l oop в списке $items в первый раз, затем снова l oop в том же списке, чтобы заполнить список детей для каждого родителя, вам нужно сравнить id и parent_id, если это правда, вы вводите элемент в список детей родителя, вы удаляете элемент для очистки вашего массива, а затем вы завершаете оператор для текущей $item итерации.

Я надеюсь, что это достаточно ясно.

foreach($items as $k => $item) {
   foreach($items as $j => $parent) {
       if ($item['parent_id'] === $parent['id']) {
           $parents[$j]['children'][] = $item;
           unset($items[$k]);
           continue 2;
       }
   }
} 
...