首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多级子父类别打印到optgroup和selectbox中。

将多级子父类别打印到optgroup和selectbox中。
EN

Stack Overflow用户
提问于 2013-12-31 09:47:06
回答 1查看 1.8K关注 0票数 2

我有这个类别的MySql表:

代码语言:javascript
复制
id , name , parent

现在,使用这个function,我在selectboxoptgroup html标记中列出了类别:

代码语言:javascript
复制
$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>";

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

代码语言:javascript
复制
<select class="selectpicker" >
   <optgroup label="News">
     <option selected value="13">War</option>
   </optgroup>
   <optgroup label="article">
     <option selected value="14">tech</option>
   </optgroup>
</select>

现在,我有三个问题:

如果我创建了许多子函数,这个函数就不能工作,只能打印One Child。我需要喜欢这个:

代码语言:javascript
复制
News
--Sport
--War
--tech
Article
--tech
--php
--linux

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

代码语言:javascript
复制
News
--Sport
----Sky
----Football
------Football-1
--War
----War1
--tech
Article
--tech
----tech2
------tech3
--php
--linux

3-不打印类别如果父=0(根),此打印仅与子父类别。

如何修复/打印这个?

EN

回答 1

Stack Overflow用户

发布于 2013-12-31 10:23:49

你不能。selectoptgroup不支持多层虽然标准说他们应该。您将不得不手动离开您的选择与&nbsp;根据他们的水平。正常空间不起作用。

您似乎还没有实现这个多级树。首先,我将阅读这个问题上的答案。

然后编写一个简单的递归函数,如下所示:

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
function getChildren($id) {
    $categories = DataAccess::fetch("
      SELECT 
        *
      FROM 
        cats
      WHERE 
        cats.parent = $id
    ");

    return $categories;
}

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

很明显,这意味着要进行大量的查询。您要么需要切换到嵌套的set层次结构,要么需要缓存生成的HTML。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20855270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档