2012-02-21 5 views
1

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

 
---------------------------------------- 
| 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 

В принципе мне нужно перебирать categorys создавая 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> 

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

+1

Есть ли таблица из SQL-запроса? –

+0

Да, это начало из таблицы mysql, которая вставляется в класс/объект категории, однако, если я могу сделать это на конце SQL, тогда отличный – azzy81

+0

возможный дубликат: http://stackoverflow.com/questions/8847365/convert-my-database -table-to-a-tree-and-get-leaf-nodes-in-php и http://stackoverflow.com/questions/7649803/collapsible-dynamic-bom-via-jquery – Yoshi

ответ

2

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

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

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

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

enter image description here

+0

IM, имеющий читать сейчас m8 спасибо , Я дам вам знать, как я нахожусь ^^ – azzy81

+0

* Извините, только что поняли, что в этом блоге есть два метода. На первой странице есть модель смежности (это то, что вы пытаетесь в тот момент, когда я думаю). Вторая/третья страницы - это левый/правый метод дерева, который немного более сложный, но, по моему опыту, гораздо более расширяемый. – Benno

+1

Мне очень нравится это решение вложенного набора, и Id никогда не слышал об этом. Я действительно не использовал его в качестве своего решения в конце, но я чувствую, что все решения - это самый красивый и самый расширяемый способ, чтобы я обозначил это как мой принятый ответ. Спасибо всем, кто ответил, хотя ... все ваши легенды ^^ – azzy81

0

Сначала создайте древовидную структуру и вставьте свои категории в дерево с помощью 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>"; 
} 
0

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

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
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);