Создание неупорядоченного списка с помощью PHP + CodeIgniter из базы данных MySQL - PullRequest
2 голосов
/ 25 мая 2010

Я пытаюсь создать динамически сгенерированный неупорядоченный список в следующем формате с использованием PHP. Я использую CodeIgniter, но это может быть просто php.

Это конечный результат, который мне нужен.

<ul id="categories" class="menu">
<li rel="1">
    Arts &amp; Humanities
    <ul>
        <li rel="2">
            Photography
            <ul>
                <li rel="3">
                    3D
                </li>
                <li rel="4">
                    Digital
                </li>
            </ul>
        </li>
        <li rel="5">
            History
        </li>
        <li rel="6">
                        Literature
        </li>
    </ul>
</li>
<li rel="7">
    Business &amp; Economy
</li>
<li rel="8">
    Computers &amp; Internet
</li>
<li rel="9">
    Education
</li>
<li rel="11">
    Entertainment
    <ul>
        <li rel="12">
            Movies
        </li>
        <li rel="13">
            TV Shows
        </li>
        <li rel="14">
            Music
        </li>
        <li rel="15">
            Humor
        </li>
    </ul>
</li>
<li rel="10">
    Health
</li>

А вот мой SQL, с которым мне нужно работать.

--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `id` mediumint(8) NOT NULL auto_increment,
  `dd_id` mediumint(8) NOT NULL,
  `parent_id` mediumint(8) NOT NULL,
  `cat_name` varchar(256) NOT NULL,
  `cat_order` smallint(4) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Итак, я знаю, что мне понадобится как минимум 1 цикл foreach для генерации первого уровня категорий.

Чего я не знаю, так это как выполнять итерацию внутри каждого цикла, проверять родителей и динамически, чтобы могло существовать бесконечное дерево детей.

Спасибо за любую помощь, которую вы можете предложить.

Тим

1 Ответ

4 голосов
/ 25 мая 2010

Если вы выводите каждую категорию, то я, вероятно, сделаю это в два шага:

Сначала соберите все необходимые данные из базы данных

$items = array();

$res = mysql_query(...);
while ($row = mysql_fetch_assoc($res)) {
 $items[$row['parent_id']][] = $row;
}

Тогда все ваши предметы сгруппированы по их родителям. Затем вы можете использовать рекурсивную функцию для обработки их всех:

function showMenu($items, $parent = null) {
 // Assuming root elements have parent_id of 0:
 $index = $parent == null ? '0' : $parent;

 if (empty($items[$index])) {
  // No children, don't output anything
  return;
 }

 echo '<ul', $parent == null ? ' id="categories" ... ' : '', '>';

 foreach ($items[$index] as $child) {
  echo '<li rel="', $child['id'], '">', htmlentities($child['cat_name']);
  showMenu($items, $child['id']);
  echo '</li>';
 }

 echo '</ul>';
}

showMenu($items);

Функция рекурсивно вызывается для каждого элемента в меню и проверяет, есть ли у этого элемента дочерние элементы. Если это так, он печатает соответствующие записи <li/> и снова вызывает себя, чтобы распечатать дочерние элементы элемента .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...