gpt4 book ai didi

php - 将多级子父类别打印到 optgroup 和 selectbox

转载 作者:行者123 更新时间:2023-11-29 03:02:35 24 4
gpt4 key购买 nike

我有这个类别的 MySql 表:

id , name , parent

现在有了这个函数,我在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-如果我创建了很多 child 这个函数不起作用并且只打印One Child。我需要这样:

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

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

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

3 - 如果父级 = 0(根)则不打印类别,这仅打印具有子父级的类别。

如何修复/打印这个?

最佳答案

你不能。 selectoptgroup 不支持多级although standard says they should .您必须根据级别手动用   向左填充您的选项。普通空间不起作用。

您似乎还没有实现这个多级树。我首先阅读关于这个 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。

关于php - 将多级子父类别打印到 optgroup 和 selectbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20855270/

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