LINUX.ORG.RU

История изменений

Исправление 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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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
ID это понятно что, PARENT_ID это привязка к родительскому пункту, TITLE тоже понятно что.

Код с выводом:

// Сначала корни и родители, потом дети
$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>