在PHP中显示层次结构

时间:2014-11-13 14:42:05

标签: php hierarchy

我有一个存储食物等级的数据库。

Category(id_cat,name_cat);
his_low_cat(id_cat,id_low_cat);

一个类别可以有0..n低类别。如果它没有较低的类别,我会在id_cat,-1中执行his_low_cat字段。

我不知道是否可能,但我想在一种“下拉菜单”中显示它 (如果您对如何显示完整的层次结构有任何其他想法,请提出建议)

像这样:

echo " <div id=\"menu\"> 
   <ul class=\"niveau1\"> 
      <li class=\"sousmenu\"><a href=\"Food\">Food</a> 
         <ul class=\"niveau2\"> 
            <li class=\"sousmenu\"><a href=\"Sous menu 1.1\">Sous menu 1.1</a> 
               <ul class=\"niveau3\"> 
                  <li><a href=\"Sous sous menu 1.1.1\">Sous sous menu 1.1.1</a></li>  
               </ul> 
            </li> 
            <li><a href=\"Sous menu 1.2\">Sous menu 1.2</a></li> 
         </ul> 
      </li> 
   </ul> 
</div>";

我的第一只猫是“食物”,然后它衍生出4个较低的类别,这些类别来自更多。

问题是它必须是动态的并且从我的数据库加载字段。 目标是能够捕获点击的值并将其用于另一个.php

我该怎么做?

1 个答案:

答案 0 :(得分:1)

递归肯定是解决这个问题的方法,我编写了这个解决方案:

<?php
function nestElements($elements, $depth=0)
{
    foreach($elements as $elementName=>$element)
    {
         echo str_repeat("\t", $depth).'<ul class="niveau'.($depth+1).'">'."\n";
         if(is_array($element))
         {
               echo str_repeat("\t", $depth+1)."<li class=\"sousmenu\"><a href=\"${elementName}\">${elementName}</a>\n";
               nestElements($element, $depth+2);
               echo str_repeat("\t", $depth+1)."</li>\n";
         }
         else
         {
               echo str_repeat("\t", $depth+1)."<li class=\"sousmenu\"><a href=\"${element}\">${elementName}</a></li>\n";
         }
         echo str_repeat("\t", $depth)."</ul>\n";
    }
}
nestElements(array("Food"=>array("Meat"=>array("Poultry"=>array("Chicken"=>"Meat/Poultry/Chicken"), "Beef"=>array("Hamburgers"=>"Meat/Beef/Hamburgers", "Steak"=>"Meat/Beef/Steak")), "Dairy"=>array("Cow"=>"Dairy/Cow", "Sheep"=>"Dairy/Sheep")), "name"=>"url"));
?>

用此测试:

<?php
nestElements(array("Food"=>array("Meat"=>array("Poultry"=>array("Chicken"=>"Meat/Poultry/Chicken"), "Beef"=>array("Hamburgers"=>"Meat/Beef/Hamburgers", "Steak"=>"Meat/Beef/Steak")), "Dairy"=>array("Cow"=>"Dairy/Cow", "Sheep"=>"Dairy/Sheep")), "name"=>"url"));
?>

结果:

<ul class="niveau1">
    <li class="sousmenu"><a href="Food">Food</a></li>
    <ul class="niveau2">
            <li class="sousmenu"><a href="Meat">Meat</a></li>
            <ul class="niveau3">
                    <li class="sousmenu"><a href="Poultry">Poultry</a></li>
                    <ul class="niveau4">
                            <li class="sousmenu"><a href="Meat/Poultry/Chicken">Chicken</a></li>
                    </ul>
            </ul>
            <ul class="niveau3">
                    <li class="sousmenu"><a href="Beef">Beef</a></li>
                    <ul class="niveau4">
                            <li class="sousmenu"><a href="Meat/Beef/Hamburgers">Hamburgers</a></li>
                    </ul>
                    <ul class="niveau4">
                            <li class="sousmenu"><a href="Meat/Beef/Steak">Steak</a></li>
                    </ul>
            </ul>
    </ul>
    <ul class="niveau2">
            <li class="sousmenu"><a href="Dairy">Dairy</a></li>
            <ul class="niveau3">
                    <li class="sousmenu"><a href="Dairy/Cow">Cow</a></li>
            </ul>
            <ul class="niveau3">
                    <li class="sousmenu"><a href="Dairy/Sheep">Sheep</a></li>
            </ul>
    </ul>
</ul>
<ul class="niveau1">
    <li class="sousmenu"><a href="url">name</a></li>
</ul>

要解析它,你必须制作一个mod_rewrite,重定向到index.php?r = TheURL并从它们中,使用&#34; /&#34;爆炸r参数;作为分隔符,您有一个菜单和子菜单列表,点击链接来自。通过添加另一个参数,可以自动生成url coul。

编辑:解决了原始代码输出问题,如下所示

<li class="sousmenu"><a href="Sheep">Sheep</a></li>
<li class="sousmenu"><a href="Dairy/Sheep">Sheep</a></li>

生成数组:

<?php
function genArray(&$targetArray, $parentID=null){
    $res=(is_null($parentID))?mysql_query("SELECT * FROM categorie WHERE id_cat NOT IN (SELECT id_low_cat FROM hislowcat) ORDER BY id_cat DESC;"):mysql_query("SELECT *, (SELECT name_cat FROM categorie WHERE id_cat= '".$parentID ."') AS name_cat FROM hislowcat WHERE id_cat= '" .$parentID ."'");
    if(!is_null($parentID) && !mysql_num_rows($res))
    {
        $res3=mysql_query("SELECT name_cat FROM categorie WHERE id_cat='${parentID}';");
        $row3=mysql_fetch_array($res3);
        $targetArray[$row3['name_cat']]=$row3['name_cat'];
        return;
    }
    while(($row=mysql_fetch_array($res)))
    {
        //echo $row->name_cat;
        if(is_null($parentID))
        {
             if(!isset($targetArray[$row['name_cat']]))
             {
                   $targetArray[$row['name_cat']]=array();
             }
             genArray($targetArray[$row['name_cat']], $row['id_cat']);
        }
        else
        {
             genArray($targetArray[$row['name_cat']], $row['id_low_cat']);
        }
    }
}
$array=array();
genArray($array);
print_r($array);
?>

注意$ targetArray是如何设置为参考的,这样我们就可以一维地对待它。