循环通过具有未知数量级别的多级数组

时间:2012-02-21 11:35:34

标签: php arrays iteration php4

我有一个类别表,如下所示:

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

基本上我需要遍历这些类别,创建一个UL LI html列表,如下所示:

<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。 id可能是parentId中深层次的任意数量级别。我用PHP来解决这个问题。因为有很多级别的深度我认为我需要做一些array_walk funuction而不是如何。另外,为了让它的机器运行得更加困难,它运行PHP4并且我知道它需要升级但是它不能在最后因此我需要一个理想的php 4解决方案。我应该怎么做呢?

4 个答案:

答案 0 :(得分:2)

尝试使用左/右树方法将分层信息存储在数据库中。

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

这就是我在我的网站上所做的,我有多级LI需要以1:6打开,并且孩子2:3,4:5,其中第一个数字是'left',第二个是正确的'。我现在有大约5个级别,但你可以有更多。这只是开发一个界面,用于根据您添加的位置设置正确的左/右值。

您只需在表格中添加“lft”和“rgt”列(如该文章中所述)。

enter image description here

答案 1 :(得分: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>";
}

答案 2 :(得分:0)

数据库的结构方式,你不能用一个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);

将查询替换为获取数据库查询结果的内容。

答案 3 :(得分: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);