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.' '); } } }

preferences:
25.16 ms | 404 KiB | 5 Q