MySQL записи с self parent_id в отсортированный каскадный массив

Мне нужна помощь с приложением, которое я создаю.

У меня есть таблица, выглядит примерно так:

+----+-----------+---------+
| id | parent_id | name    |
+----+-----------+---------+
| 1  | null      | test    |
+----+-----------+---------+
| 2  | null      | test2   |
+----+-----------+---------+
| 4  | 1         | test3   |
+----+-----------+---------+
| 5  | 2         | test4   |
+----+-----------+---------+

И теперь я получаю все данные в одном массиве. Я хотел бы получить такую ​​структуру (массив php как каскад):

array(
0 => array(
'id' => 1,
'parent_id' => null,
'name' => 'test',
'children' => array(
'id' => 4,
'parent_id' => 1,
'name' => 'test3'
)
),
1 => array(
'id' => 2,
'parent_id' => null,
'name' => 'test2',
'children' => array(
'id' => 5,
'parent_id' => 2,
'name' => 'test4'
)
)
)

Таким образом, каждая запись с «parent_id = null» будет родительской, а каждая запись с идентификатором «parent_id» будет в дочернем массиве.

Я начал это так:

$newArray = array();
foreach($names as $name) {
if($name['parent_id'] == null || $name['parent_id'] == 0) {
// entry is parent
$newArray[$name['id']] = $name['name'];
} else {
// entry is child
}
}

Но вот и мой конец, я не знаю, как это сделать. Я думаю, что я должен использовать какую-то рекурсивную функцию цикла, но я не знаю, как начать.

Было бы здорово, если бы кто-нибудь мог мне помочь.

С уважением,
Мэтт.

1

Решение

Вы можете использовать рекурсивную функцию, подобную этой (я только добавил код, который важен для понимания):

function get_children($parentId) {
$array = array();
//Load/Find $children
foreach($children as $child) {
$array[] = array(
'id' => $child->id,
'name' => 'YourName',
'children' => get_children($child->id)
);
}
return $array;
}

Если вы сохраняете данные в таком массиве, нет необходимости сохранять parent_id, потому что вы можете получить их, выполнив поиск по идентификатору родительских элементов.

0

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

Других решений пока нет …

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