3v4l.org

run code in 300+ PHP versions simultaneously
<?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