gpt4 book ai didi

PHP递归问题

转载 作者:行者123 更新时间:2023-11-29 02:05:12 33 4
gpt4 key购买 nike

我的想法很简单:if child->indent, if parent->make bold.

假设 p0 是 p1 和 p2 的父级,p3 和 p4 是 p1 的子级。 p5和p0一样是独立页。所以我想得到的是

p0 (bold font)
[3px]p1(bold font)
[ 6px ]p3
[ 6px ]p4
[3px]p2
p5 (bold font)

问题是,我想不通。如何实现我的想法。尝试了给定的功能。没有成功。它有效,但只缩进第一级 child 。我的递归 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 = '&nbsp;&nbsp;';
$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;
}
}

最佳答案

您可以通过将 $level 乘以简单缩进的像素数(在您的情况下为 3px)轻松解决缩进问题。

对于 bold 问题,您需要采用与当前代码不同的方法,您不知道该项目是否有任何子项。解决方案是首先将子项放入变量中,然后添加 bold 样式(如果存在),回显该项目,然后才处理子项。

我个人会先一次从数据库中获取所有数据,然后构建层次结构,然后使用不同的函数生成 html。参见示例 this question了解更多详情。

编辑:根据您更新的问题;您可以轻松优化它并摆脱 while 循环中的查询(顺便说一句,我仍然会选择上一段中的选项...):

  • 不要回显任何东西,只从你的函数返回一个字符串
  • 摆脱while函数中的查询
  • 交换echo 和函数调用行

函数的结果类似于:

....
$html = '';
while (...)
{
$children_html = generateOptions($data[0], $level+1, $padding, $db);
$optstyle = empty($children_html) ? 'std' : 'bold';
$html .= generateOption($optstyle.'option', $data, $padding);
$html .= $children_html;
}
return $html;

然后在您之前调用该函数的地方执行 echo generateOptions(...)

关于PHP递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7599575/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com