История изменений
Исправление MOPKOBKA, (текущая версия) :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
// Если не указан родитель PARENT_ID
// то это корень, добавляем в список корней
// если указан то это ребенок добавляем его ID к родителю
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно:
// <li>TITLE<ul>...</ul></li>
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root_row) echo_menu($menu, $root_row); ?>
</li>
Код не запускал могут быть ошибки.
Исправление MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
// Если не указан родитель PARENT_ID
// то это корень, добавляем в список корней
// если указан то это ребенок добавляем его ID к родителю
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно:
// <li>TITLE<ul>...</ul></li>
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root_row) echo_menu($menu, $root_row); ?>
</li>
Код не запускал могут быть ошибки.
Исправление MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
// Если не указан родитель PARENT_ID
// то это корень, добавляем в список корней
// если указан то это ребенок добавляем его ID к родителю
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root_row) echo_menu($menu, $root_row); ?>
</li>
Код не запускал могут быть ошибки.
Исправление MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root_row) echo_menu($menu, $root_row); ?>
</li>
Код не запускал могут быть ошибки.
Исправление MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root_row): ?>
<?php echo_menu($menu, $root_row) ?>
<?php endforeach; ?>
</li>
Код не запускал могут быть ошибки.
Исправление MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root): ?>
<?php echo_menu($menu, $roots) ?>
<?php endforeach; ?>
</li>
Код не запускал могут быть ошибки.
Исходная версия MOPKOBKA, :
Таблица меню,
ID PARENT_ID TITLE
1 NULL Пункт 1
2 1 Подпункт 1, пункта 1
3 1 Подпункт 2, пункта 1
4 NULL Пункт 2
5 4 Подпункт 1, пункта 2
6 4 Подпункт 2, пункта 2
Код с выводом:
// Сначала корни и родители, потом дети
$result = SELECT * FROM `menu` ORDER BY `PARENT_ID` IS NULL, `PARENT_ID` ASC, ID ASC;
$menu = [];
$roots = [];
while ($row = mysqli_fetch_assoc($result)) {
$row['CHILD'] = [];
if (empty($parentId = $row['PARENT_ID'])) {
$roots[] = $row;
} else {
$menu[$parentId]['CHILD'][] = $row['ID'];
}
$menu[$row['ID']][] = $row;
}
// Рекурсивная функция вывода
function echo_menu($menu, $row) {
echo '<li>', $row['TITLE'];
// Если нет детей выводится один <li>TITLE</li>
// Если дети есть выводятся они рекурсивно
if (!empty($row['CHILD'])) {
echo ' <ul>';
foreach ($row['CHILD'] as $childId) {
echo_menu($menu, $menu[$childId]);
}
echo ' </ul>';
}
echo '</li>';
}
Потом выводишь меню, начиная с корней:
<li class="menu">
<?php foreach ($roots as $root): ?>
<?php echo_menu($menu, $roots) ?>
<?php endforeach; ?>
</li>