3v4l.org

run code in 300+ PHP versions simultaneously
<?php //Есть массив: 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 = array( array( 'ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1, 'CHILD' => array( array( 'ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2 ), array( 'ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2, 'CHILD' => array( array( 'ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3, 'CHILD' => array( array( 'ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4, 'CHILD' => array( array( 'ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5 ), array( 'ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5 ) ) ), array( 'ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 4, 'SECTION_PAGE_PATH_TEMPLATE' => '#SITE_DIR#/catalog/#SECTION_CODE_PATH#/' ) ) ) ) ) ) ), array( 'ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1 ) ); <!--Вот решение, где dbAllSections содержит в себе все разделы. Оно работает, но я никак понять не могу, зачем тут делать $node = &$tree; и $node = &$node[$ancestor['INDEX']]['CHILDREN'];. Ссылки же говорят, что другая переменная будет ссылаться на то же значение, но для чего делать $node = &$tree; каждую итерацию, если они и так ссылаются на одно значение. Зачем делать $node = &$node[$ancestor['INDEX']]['CHILDREN']; тоже не понятно.--> $tree = []; $stack = []; while ($item = $dbAllSections->fetch()) { $node = &$tree; while (!empty($stack) && $stack[count($stack) - 1]['DEPTH_LEVEL'] >= $item['DEPTH_LEVEL']) { array_pop($stack); } foreach ($stack as $ancestor) { $node = &$node[$ancestor['INDEX']]['CHILDREN']; } $node[] = [ 'ID' => $item['ID'], 'NAME' => $item['NAME'] ]; $stack[] = [ 'INDEX' => count($node) - 1, 'DEPTH_LEVEL' => $item['DEPTH_LEVEL'], ]; }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.30.0140.00722.96
8.3.20.0180.00023.79
8.3.10.0140.00723.78
8.3.00.0130.00722.96
8.2.160.0090.00622.96
8.2.150.0150.00022.96
8.2.140.0170.00022.96
8.2.130.0070.01022.96
8.2.120.0100.00322.96
8.2.110.0100.00322.96
8.2.100.0100.00422.96
8.2.90.0060.00922.96
8.2.80.0100.01022.96
8.2.70.0110.00422.96
8.2.60.0070.00722.96
8.2.50.0100.01022.96
8.2.40.0190.00322.96
8.2.30.0040.01522.96
8.2.20.0140.00722.96
8.2.10.0160.00322.96
8.2.00.0090.00622.96
8.1.270.0040.01122.96
8.1.260.0070.00722.96
8.1.250.0080.00622.96
8.1.240.0100.00622.96
8.1.230.0120.00322.96
8.1.220.0080.00822.96
8.1.210.0120.00622.96
8.1.200.0120.00322.96
8.1.190.0090.00922.96
8.1.180.0040.01122.96
8.1.170.0070.00722.96
8.1.160.0040.01122.96
8.1.150.0070.01022.96
8.1.140.0060.01322.96
8.1.130.0030.01022.96
8.1.120.0080.00822.96
8.1.110.0140.00022.96
8.1.100.0100.00322.96
8.1.90.0120.00322.96
8.1.80.0080.00622.96
8.1.70.0120.00422.96
8.1.60.0120.00322.96
8.1.50.0040.01122.96
8.1.40.0120.00322.96
8.1.30.0080.00622.96
8.1.20.0110.00322.96
8.1.10.0090.00622.96
8.1.00.0070.00722.96

preferences:
133.65 ms | 993 KiB | 7 Q