<?php
$arr = [
[
'group_id' => 5,
'group_title' => 'Test group',
'group_parent_id' => 2
],
[
'group_id' => 6,
'group_title' => 'Second-level test group',
'group_parent_id' => 5
],
[
'group_id' => 7,
'group_title' => 'Third-level test group',
'group_parent_id' => 6
],
[
'group_id' => 8,
'group_title' => 'Other test group',
'group_parent_id' => 1
],
[
'group_id' => 9,
'group_title' => 'Second-level other test group',
'group_parent_id' => 8
]
];
$output = array();
$group_ids = array();
foreach ($arr as $el) {
$parent_id = $el['group_parent_id'];
if (!isset($group_ids[$parent_id])) {
// must be a top-level element
$output[] = $el;
// save a pointer
$group_ids[$el['group_id']] = &$output[array_key_last($output)];
}
else {
// already exists, $group_ids[$parent_id] points to the entry
$parent = &$group_ids[$parent_id];
if (!isset($parent['subgroups'])) {
// no subgroups array, create one
$parent['subgroups'] = array();
}
// add this entry to the subgroups
$parent['subgroups'][] = $el;
// save a pointer
$group_ids[$el['group_id']] = &$parent['subgroups'][array_key_last($parent['subgroups'])];
}
}
print_r($output);
preferences:
24.71 ms | 405 KiB | 5 Q