3v4l.org

run code in 300+ PHP versions simultaneously
<?php $sourceArray = array( array('ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1), array('ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2), array('ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2), array('ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3), array('ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4), array('ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5), array('ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5), array('ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1) ); $sourceArray2 = array( array('ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1), array('ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2), array('ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2), array('ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3), array('ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4), array('ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5), array('ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5), array('ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1), ); $expect = [ [ 'ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1, 'CHILD' => [ [ 'ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2 ], [ 'ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2, 'CHILD' => [ [ 'ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3, 'CHILD' => [ [ 'ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4, 'CHILD' => [ [ 'ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5 ], [ 'ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5 ] ] ] ] ], [ 'ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3 ] ] ] ] ], [ 'ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1 ] ]; $expect2 = [ [ 'ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1, 'CHILD' => [ [ 'ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2 ], [ 'ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2, 'CHILD' => [ [ 'ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3, 'CHILD' => [ [ 'ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4, 'CHILD' => [ [ 'ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5 ], [ 'ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5 ] ] ] ] ], [ 'ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3 ] ] ] ] ], [ 'ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1, 'CHILD' => [ array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2) ] ], [ 'ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1, 'CHILD' => [ array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2), array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 2) ] ], array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1), ]; /* ----Рекурсивный кусок говна---- */ // function makeTree(array $arr){ // $parent_lvl = -1; // $parent_index = -1; // $res = []; // foreach($arr as $index => $sub) { // $lvl = $sub['DEPTH_LEVEL']; // if ($index === 0 || $lvl === $parent_lvl) { // $parent_index++; // $res[$parent_index] = array_merge($sub, ['CHILD' => []] ); // $parent_lvl = $lvl; // } elseif($lvl > $parent_lvl) { // $res[$parent_index]['CHILD'][] = $sub; // } // } // for($i = 0; $i < count($res); $i++ ){ // $res[$i]['CHILD'] = makeTree($res[$i]['CHILD']); // } // return $res; // } // function removeEmptyNodes(array $arr) { // $count = count($arr); // for($i = 0; $i < $count; $i++){ // $hasChildNode = isset($arr[$i]['CHILD']); // $ChildNodeIsNotEmpty = $hasChildNode && count($arr[$i]['CHILD']) > 0; // if($ChildNodeIsNotEmpty){ // $arr[$i]['CHILD'] = removeEmptyNodes($arr[$i]['CHILD']); // } elseif ($hasChildNode) { // unset($arr[$i]['CHILD']); // } // } // return $arr; // } // $res = removeEmptyNodes(makeTree($sourceArray)); // $res2 = removeEmptyNodes(makeTree($sourceArray2)); // test($res, $expect); echo "\n"; // test($res2, $expect2); echo "\n"; // mijikaiDump($res); echo "\n"; // mijikaiDump($res2); echo "\n"; // var_dump($res); echo "\n\n\n\n\n"; // var_dump($res2); /* ----Рекурсивный кусок говна---- */ /* ----Нерекурсивный сладкий рулет---- */ function makeTreeIter(array $arr){ $parents = []; // level => index $res = []; foreach($arr as $index=>$sub){ $lvl = $sub['DEPTH_LEVEL']; if(isset($parents[$lvl-1])){ $i = &$parents[$lvl-1]; $i['CHILD'][] = $sub; $lastIndex = count($i['CHILD'])-1; $ref = &$i['CHILD'][$lastIndex]; $parents[$lvl] = &$ref; } else { $res[] = $sub; $lastIndex = count($res)-1; $ref = &$res[$lastIndex]; $parents[$lvl] = &$ref; } } return $res; } $res = makeTreeIter($sourceArray); $res2 = makeTreeIter($sourceArray2); test($res, $expect); echo "\n"; test($res2, $expect2); echo "\n"; mijikaiDump($res); echo "\n"; mijikaiDump($res2); echo "\n"; var_dump($res); echo "\n\n\n\n\n"; var_dump($res2); /* ----Нерекурсивный сладкий рулет---- */ function test($res, $expect) { if($res === $expect) { echo "OK: resuling and expected arrays match."; } else { throw new Exception("KO: resulting and expected arrays don't match."); } } function mijikaiDump(array $arr, string $tab = ''):void { foreach($arr as $val){ echo $tab.$val['DEPTH_LEVEL']." ".$val['NAME']."\n"; if(isset($val['CHILD'])) { mijikaiDump($val['CHILD'],$tab.' '); } } }
Output for 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
OK: resuling and expected arrays match. OK: resuling and expected arrays match. 1 Телефоны и гаджеты 2 Смартфоны 2 Аксессуары для гаджетов 3 Аксессуары для телефонов 4 Чехлы для смартфонов 5 Чехлы для Apple 5 Чехлы для Samsung 3 Защитные стекла для телефонов 1 Компьютерная техника 1 Телефоны и гаджеты 2 Смартфоны 2 Аксессуары для гаджетов 3 Аксессуары для телефонов 4 Чехлы для смартфонов 5 Чехлы для Apple 5 Чехлы для Samsung 3 Защитные стекла для телефонов 1 Компьютерная техника 2 Компьютерная техника 1 Компьютерная техника 2 Компьютерная техника 2 Компьютерная техника 1 Компьютерная техника array(2) { [0]=> array(4) { ["ID"]=> int(705) ["NAME"]=> string(34) "Телефоны и гаджеты" ["DEPTH_LEVEL"]=> int(1) ["CHILD"]=> array(2) { [0]=> array(3) { ["ID"]=> int(706) ["NAME"]=> string(18) "Смартфоны" ["DEPTH_LEVEL"]=> int(2) } [1]=> array(4) { ["ID"]=> int(5586) ["NAME"]=> string(44) "Аксессуары для гаджетов" ["DEPTH_LEVEL"]=> int(2) ["CHILD"]=> array(2) { [0]=> array(4) { ["ID"]=> int(715) ["NAME"]=> string(46) "Аксессуары для телефонов" ["DEPTH_LEVEL"]=> int(3) ["CHILD"]=> array(1) { [0]=> array(4) { ["ID"]=> int(716) ["NAME"]=> string(38) "Чехлы для смартфонов" ["DEPTH_LEVEL"]=> int(4) ["CHILD"]=> array(2) { [0]=> array(3) { ["ID"]=> int(5536) ["NAME"]=> string(23) "Чехлы для Apple" ["DEPTH_LEVEL"]=> int(5) } [1]=> array(3) { ["ID"]=> int(5539) ["NAME"]=> string(25) "Чехлы для Samsung" ["DEPTH_LEVEL"]=> int(5) } } } } } [1]=> array(3) { ["ID"]=> int(3010) ["NAME"]=> string(55) "Защитные стекла для телефонов" ["DEPTH_LEVEL"]=> int(3) } } } } } [1]=> array(3) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(1) } } array(4) { [0]=> array(4) { ["ID"]=> int(705) ["NAME"]=> string(34) "Телефоны и гаджеты" ["DEPTH_LEVEL"]=> int(1) ["CHILD"]=> array(2) { [0]=> array(3) { ["ID"]=> int(706) ["NAME"]=> string(18) "Смартфоны" ["DEPTH_LEVEL"]=> int(2) } [1]=> array(4) { ["ID"]=> int(5586) ["NAME"]=> string(44) "Аксессуары для гаджетов" ["DEPTH_LEVEL"]=> int(2) ["CHILD"]=> array(2) { [0]=> array(4) { ["ID"]=> int(715) ["NAME"]=> string(46) "Аксессуары для телефонов" ["DEPTH_LEVEL"]=> int(3) ["CHILD"]=> array(1) { [0]=> array(4) { ["ID"]=> int(716) ["NAME"]=> string(38) "Чехлы для смартфонов" ["DEPTH_LEVEL"]=> int(4) ["CHILD"]=> array(2) { [0]=> array(3) { ["ID"]=> int(5536) ["NAME"]=> string(23) "Чехлы для Apple" ["DEPTH_LEVEL"]=> int(5) } [1]=> array(3) { ["ID"]=> int(5539) ["NAME"]=> string(25) "Чехлы для Samsung" ["DEPTH_LEVEL"]=> int(5) } } } } } [1]=> array(3) { ["ID"]=> int(3010) ["NAME"]=> string(55) "Защитные стекла для телефонов" ["DEPTH_LEVEL"]=> int(3) } } } } } [1]=> array(4) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(1) ["CHILD"]=> array(1) { [0]=> array(3) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(2) } } } [2]=> array(4) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(1) ["CHILD"]=> array(2) { [0]=> array(3) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(2) } [1]=> array(3) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(2) } } } [3]=> array(3) { ["ID"]=> int(660) ["NAME"]=> string(39) "Компьютерная техника" ["DEPTH_LEVEL"]=> int(1) } }

preferences:
80.6 ms | 430 KiB | 5 Q