цикл через многоуровневый массив с неизвестным количеством уровней - PullRequest
1 голос
/ 21 февраля 2012

У меня есть таблица категорий, которая выглядит следующим образом:

----------------------------------------
|  id   |  parentId  |  Name           |
----------------------------------------
   1          0         Cat 1
   2          0         Cat 2
   3          0         Cat 3
   4          2         Cat 4
   5          3         Cat 5
   6          5         Cat 6

В основном мне нужно перебирать категории, создавая HTML-список UL LI, как показано ниже:

<ul id="categories">
    <li id="1">Cat 1</li>
    <li id="2">Cat 2
       <ul>
           <li id="4">Cat 4</li>
       </ul>
    </li>
    <li id="3">Cat 3
        <ul>
           <li id="5">Cat 5
               <ul>
                   <li id="6">Cat 6</li>
               </ul>
           </li>
        </ul>
    </li>
</ul>

Imвозникли серьезные проблемы, пытаясь перебрать это, пытаясь создать вышеупомянутый HTML.Идентификатор может быть любым количеством уровней в пределах parentId.Я сделаю это в PHP.Поскольку существует n-е количество уровней, я думаю, что мне нужно выполнить какую-то функцию array_walk, но не так, как.Кроме того, чтобы немного усложнить работу машины, на которой она работает, работает PHP4, и я знаю, что она нуждается в обновлении, но это не так быстро, поэтому в идеале мне нужно решение php 4.Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Попробуйте левый / правый метод дерева для хранения иерархической информации в базе данных.

http://blogs.sitepoint.com/hierarchical-data-database/

Это то, что я делаю на своем веб-сайте, где у меня есть многоуровневые LI, которые нужно открывать в 1: 6, и иметь детей 2: 3,4: 5, где первое число - «левый», а второе - «левый». право'. На данный момент у меня около 5 уровней, но вы могли бы иметь гораздо больше Это всего лишь вопрос разработки интерфейса для установки правильных значений влево / вправо в зависимости от положения, к которому вы добавляете его.

Вам просто нужно добавить столбцы 'lft' и 'rgt' в вашу таблицу (как описано в этой статье).

enter image description here

0 голосов
/ 21 февраля 2012
function writelevel($id, $txt, $children) {
  if (isset($txt[$id]))
    echo "<li id=\"$id\">".$txt[$id];
  if (isset($children[$id])) {
    echo "<ul>";
    foreach ($children[$id] as $child)
      writelevel($child, $txt, $children);
    echo "</ul>";
  }
  if (isset($txt[$id]))
    echo "</li>";
}

//Assuming your query is done and the result is in $qry

$txt=array();
$children=array();


//Fetch and structure data
while (true) {
  //Fetch next row
  $row=mysql_fetch_row($qry);
  if (!$row) break;

  //Store text
  $txt[$row[0]]=$row[2];

  //Store child relationships
  if (!isset($children[$row[1]])) $children[$row[1]]=array();
  $children[$row[1]]=$row[0];
}

//Writeout
writelevel(0);
0 голосов
/ 21 февраля 2012

Структура вашей базы данных, вы не можете сделать это с помощью одного запроса MySQL, и вы должны сделать это рекурсивно.Что-то в соответствии с:

function print_children ($id) {
    $children = query("SELECT * FROM `table` WHERE `parentId` = " . (int)$id);
    if (!empty($children)) {
         echo '<ul>';
         foreach ($children as $child) {
              echo '<li>' . $child['name'];
              print_children($child['id']);
              echo '</li>';
         }     
         echo '</ul>';
    }
}

print_children(0);

Замените запрос на что-то, что получает результаты для вашего запроса к базе данных.

0 голосов
/ 21 февраля 2012

Сначала создайте древовидную структуру и вставьте свои категории в дерево, используя id и parent_id.Затем попробуйте Depth-first_search , используя либо список ссылок на обрабатываемые массивы, либо рекурсию.

function printRecList($tree){
   // exit condition
   if (is_string($tree))
       echo "<li>$tree</li>";

   echo "<ul>";
   foreach ($tree as $subtree)
       printRecList($subtree); // recursion step
   echo "</ul>";
}
...