@ 2024-02-25T21:53:44Z <?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'],
];
}
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
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).
Version System time (s) User time (s) Memory (MiB) 8.3.3 0.014 0.007 22.96 8.3.2 0.018 0.000 23.79 8.3.1 0.014 0.007 23.78 8.3.0 0.013 0.007 22.96 8.2.16 0.009 0.006 22.96 8.2.15 0.015 0.000 22.96 8.2.14 0.017 0.000 22.96 8.2.13 0.007 0.010 22.96 8.2.12 0.010 0.003 22.96 8.2.11 0.010 0.003 22.96 8.2.10 0.010 0.004 22.96 8.2.9 0.006 0.009 22.96 8.2.8 0.010 0.010 22.96 8.2.7 0.011 0.004 22.96 8.2.6 0.007 0.007 22.96 8.2.5 0.010 0.010 22.96 8.2.4 0.019 0.003 22.96 8.2.3 0.004 0.015 22.96 8.2.2 0.014 0.007 22.96 8.2.1 0.016 0.003 22.96 8.2.0 0.009 0.006 22.96 8.1.27 0.004 0.011 22.96 8.1.26 0.007 0.007 22.96 8.1.25 0.008 0.006 22.96 8.1.24 0.010 0.006 22.96 8.1.23 0.012 0.003 22.96 8.1.22 0.008 0.008 22.96 8.1.21 0.012 0.006 22.96 8.1.20 0.012 0.003 22.96 8.1.19 0.009 0.009 22.96 8.1.18 0.004 0.011 22.96 8.1.17 0.007 0.007 22.96 8.1.16 0.004 0.011 22.96 8.1.15 0.007 0.010 22.96 8.1.14 0.006 0.013 22.96 8.1.13 0.003 0.010 22.96 8.1.12 0.008 0.008 22.96 8.1.11 0.014 0.000 22.96 8.1.10 0.010 0.003 22.96 8.1.9 0.012 0.003 22.96 8.1.8 0.008 0.006 22.96 8.1.7 0.012 0.004 22.96 8.1.6 0.012 0.003 22.96 8.1.5 0.004 0.011 22.96 8.1.4 0.012 0.003 22.96 8.1.3 0.008 0.006 22.96 8.1.2 0.011 0.003 22.96 8.1.1 0.009 0.006 22.96 8.1.0 0.007 0.007 22.96
preferences:dark mode live preview ace vim emacs key bindings
133.65 ms | 993 KiB | 7 Q