将多级子父类别打印到optgroup并选择框

时间:2013-12-31 09:47:06

标签: php mysql

我有这个类别的MySql表:

id , name , parent

现在使用此function i列出selectboxoptgroup html个标签中的类别:

$options    = array();
$categories = DataAccess::fetch("
  SELECT 
    * , p.name AS parent 
  FROM 
    cats AS child
  INNER JOIN
    cats AS p ON p.id = child.parent
");
foreach($categories as $category){
  $parent = $category['parent'];
  if (! isset($options[$parent])) $options[$parent] = array();
  $options[$parent][$category['id']] = $category['name'];
}
echo '<select>';
$selid = 13;
foreach($options as $group => $option) {
  printf('<optgroup label="%s">', $group);
  foreach ($option as $id => $label) {
   $selcat = ($selid == $id) ? 'selected' : '';
    printf('<option %s value="%s">%s</option>',$selcat, $id, $label);

  }
  printf('</optgroup>');
}
echo "</select>";

此函数ouhput适用于One child父类别和输出:

<select class="selectpicker" >
   <optgroup label="News">
     <option selected value="13">War</option>
   </optgroup>
   <optgroup label="article">
     <option selected value="14">tech</option>
   </optgroup>
</select>

现在,我有三个问题:

1-如果我创建了多个孩子这个功能不起作用,只打印One Child。我需要喜欢这个:

News
--Sport
--War
--tech
Article
--tech
--php
--linux

2 - 需要使用Multilevel打印optgroup类别,如下所示:

News
--Sport
----Sky
----Football
------Football-1
--War
----War1
--tech
Article
--tech
----tech2
------tech3
--php
--linux

3 - 如果parent = 0(root),则不打印类别,此打印仅包含子父级的类别。

如何修复/打印此内容?

1 个答案:

答案 0 :(得分:1)

你做不到。 selectoptgroup不支持多个级别although standard says they should。您必须根据自己的级别,使用&nbsp;手动填充您的选项。普通空间不起作用。

您似乎尚未实现此多级树。我首先阅读question上的答案。

然后我会编写一个简单的递归函数:

function walkTree($nodes, $level = 0) {
    foreach($nodes as $node) {
        echo '<option>' . str_repeat('&nbsp;', $level) . $node->label . '</option>';
        if($node->children) {
            walkTree($node->children, $level + 1); 
        }
    }
}

walkTree($root->children);

这假设您有一个对象层次结构,但这不是必需的。您可以使用现有数据库并编写一个返回另一个节点的所有子节点的函数:

function getChildren($id) {
    $categories = DataAccess::fetch("
      SELECT 
        *
      FROM 
        cats
      WHERE 
        cats.parent = $id
    ");

    return $categories;
}

然后你需要得到根节点的初始列表(WHERE cats.parent IS NULL可能吗?) 并将其传递给walkTree,其中$node->children替换为getChildren($node->id)

显然这意味着很多查询。您需要切换到嵌套集层次结构或类似的东西,或者可能缓存生成的HTML。