我的想法很简单:if child-> indent,if parent-> make bold。PHP递归问题
比方说p0为P1和P2,P3和P4的母公司是P1的孩子的。 p5是像p0这样的独立页面。所以我想得到的是
p0 (bold font)
[3px]p1(bold font)
[ 6px ]p3
[ 6px ]p4
[3px]p2
p5 (bold font)
问题是,我想不通。如何实现我的想法。试过给定的功能。没有成功。它的工作原理,但只缩进一级孩子。我的递归PHP功能看起来像
function generateOptions($parent, $level, $padding, $db)
{
$result=$db->query("SELECT id, name FROM menu WHERE parent='$parent' AND showinmenu!='0'");
if($level == 0) {$padding=''; $optstyle='bold';}
else {$optstyle='std'; $padding=' ';}
while($data=$result->fetch_row()){
echo generateOption($optstyle.'option', $data, $padding);
generateOptions($data[0], $level++, $padding, $db);
}
}
function generateOption($type,$data, $padding){
switch($type){
case 'boldoption': return '<option class="bold" value="'.$data[0].'">'.$padding.$data[1]."</option>\n"; break;
case 'stdoption': return '<option class="std" value="'.$data[0].'">'.$padding.$data[1]."</option>\n"; break;
}
}
这里是我的数据库表的截图。 http://prntscr.com/39461
最后的工作效果
function generateOptions($parent, $level, $padding, $db)
{
$result=$db->query("SELECT id, name FROM menu WHERE parent='$parent' AND showinmenu!='0'");
$spacer = ' ';
$padding = str_repeat($spacer, $level);
while($data=$result->fetch_row()){
$children_html = generateOptions($data[0], $level+1, $padding, $db);
$optstyle = empty($children_html) ? 'std' : 'bold';
$html .= generateOption($optstyle.'option', $level, $data, $padding);
$html .= $children_html;
}
return $html;
}
function generateOption($type, $level, $data, $padding){
$bgcolor=array('0'=>'#f66e02','1'=>'#FF9C4D', '2'=>'#FF9C4D');
$fontcolor=array('0'=>'#fff','1'=>'#000', '2'=>'#000');
switch($type){
case 'boldoption': return '<option class="bold" style="background-color:'.$bgcolor[$level].'; color:'.$fontcolor[$level].'" value="'.$data[0].'">'.$padding.$data[1]."</option>\n"; break;
case 'stdoption': return '<option class="std" value="'.$data[0].'">'.$padding.$data[1]."</option>\n"; break;
}
}
我无法弄清楚如何实现你已经发送到我的代码的链接 – demonoid
有3个步骤:第一步你得到你的数据库信息在一个平面数组中,然后你在多维数组中变换这个平面数组(使用该递归函数的变体),然后你可以编写不同的(递归...)函数来生成html输出想要(或者只有一个用于你的“选项”) – jeroen
我更新了我的问题请看看 – demonoid