我有一个存储食物层次结构的数据库。
Category(id_cat,name_cat);
his_low_cat(id_cat,id_low_cat);
一个类别可以有0..n个低类别。如果它没有更低的类别,我在his_low_cat
中做一个id_cat,-1
字段。
我不知道这是否可能,但我想在一种"下拉菜单"中显示它(如果你对如何显示完整的层次结构有任何其他想法,请提出建议)
像这样:
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 中使用它
我该怎么做?
递归肯定是解决这个问题的方法,我已经编写了这个解决方案:
<?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>
要解析它,你必须制作一个重定向到index.php的mod_rewrite?r=URL,从它们的URL中,使用"/"作为delimeter分解r参数,然后您就有了一个菜单和子菜单列表,单击的链接来自这些菜单和子目录。通过添加另一个参数,可以自动生成url。
编辑:修复了下方原始代码输出的问题
<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是如何设置为引用的,这样我们就可以一维地处理它。