我正在制作一个图片库,需要一些关于循环类别的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于循环无限深度的问题,而是循环已知深度的最有效方式,并输出所有结果。
基本上,我想创建一个<select>
框,其中包含系统中定义的所有类别,包括儿童,孙子等。
类别存储在数据库中如下(还有其他字段,但它们不相关):
+----+--------+--------------+
| id | parent | name |
+----+--------+--------------+
| 1 | 0 | Parent 1 |
| 2 | 1 | Child Lvl 1 |
| 3 | 2 | Child Lvl 2 |
| 4 | 0 | Parent 2 |
+----+--------+--------------+
任何具有parent
== 0的类别都被视为顶级父级。正如我已经提到的,最大深度是已知的和预定的,所以我想输出这样的东西:
Parent 1
- Child Lvl 1
- Child Lvl 2
Parent 2
我原以为这可能是while
循环,但由于某种原因,这会导致PHP进入无限循环。
这是我到目前为止尝试过的代码:
$sql = $_database->prepare("SELECT `id`, `name` FROM `".TBL_PREFIX."categories` WHERE `parent` = '0' ORDER BY `name` ASC");
$sql->execute();
while($cat = $sql->fetchObject())
{
$html.= "\n\t".'<option value="'.$cat->id.'"';
$html.= (array_key_exists('selected_val', $options) && $options['selected_val'] == $cat->id) ? ' selected="selected"' : '';
$html.= (array_key_exists('disabled_vals', $options) && in_array('', $options['disabled_vals'])) ? ' disabled="disabled"' : '';
$html.= '>'.$cat->name.'</option>';
$childSql = $_database->prepare("SELECT COUNT(*) AS `total` FROM `".TBL_PREFIX."categories` WHERE `parent` = :parent");
$childSql->execute(array(':parent' => $cat->id));
$numChildren = $childSql->fetchObject();
$numChildren = $numChildren->total;
$parentId = $cat->id;
while($numChildren > 0)
{
for($i = 0; $i < (MAX_CAT_DEPTH - 1); $i++)
{
$children = $_database->prepare("SELECT `id`, `name` FROM `catgeories` WHERE `parent` = :parent ORDER BY `name` ASC");
$children->execute(array(':parent' => $parentId));
while($child = $children->fetchObject())
{
$html.= "\n\t".'<option value="'.$child->id.'"';
$html.= (array_key_exists('selected_val', $options) && $options['selected_val'] == $child->id) ? ' selected="selected"' : '';
$html.= (array_key_exists('disabled_vals', $options) && in_array('', $options['disabled_vals'])) ? ' disabled="disabled"' : '';
$html.= '>'.$child->name.'</option>';
$parentId = $child->id;
$childSql = $_database->prepare("SELECT COUNT(*) AS `total` FROM `".TBL_PREFIX."categories` WHERE `parent` = :parent");
$childSql->execute(array(':parent' => $parentId));
$numChildren = $childSql->fetchObject();
$numChildren = $numChildren->total;
}
}
}
}
任何人都可以建议正确的方式来解决这个问题。我宁愿不要过多地使用数据库结构,因为我相信我已经拥有的那个对于这里的要求来说已经足够了 - 这不是一个关于无限深度问题的问题。
答案 0 :(得分:1)
丑陋的尝试mptt算法,以避免递归语句。 Zebra MPTT是一个很好的解决方案。 Gedmo Tree更好。