php - 我如何从我的类别 mysql 表中制作下拉菜单仅在 parent_id 不为 0 时显示
问题描述
所以嘿,正如标题所说,我正在寻找用子类别制作我的类别。我一直在stackoverflow中寻找我需要的东西,但没有一个对我有帮助的例子..
这是我的桌子的样子 所以我知道我想要什么,我需要什么,但我不知道我怎么能做到这一点
- 我必须
SELECT * FROM categories ORDER by position ASC
- 我必须检查是否
parent_id
大于 0。 - 我必须
parent_id
从我的导航栏中删除 ,并仅在它应该位于的类别名称下显示它们 bydropdown menu
。
但我不知道我怎么能做到这一切..
这是我只选择我的类别并显示它们的方式
$catsq = mysqli_query($con,"SELECT * FROM categories ORDER by position ASC");
while($catinfo=mysqli_fetch_assoc($catsq)) {
echo '
<li class="nav-item'.(isset($_GET["cat"]) && $_GET["cat"]==$catinfo["id"] ? " active" : "").'">
<a class="nav-link" href="./index.php?cat='.$catinfo["id"].'">'.$catinfo["name"].'</a>
</li>
';
}
它看起来像这样
<ul class="nav navbar-nav">
<li class="nav-item">
<a class="nav-link" href="cat=1">TestCat</a>
</li>
<li class="nav-item">
<a class="nav-link" href="cat=2">TestCat2</a>
</li>
<li class="nav-item">
<a class="nav-link" href="cat=3">TestSub</a>
</li>
</ul>
但我希望它看起来像这样
<ul class="nav navbar-nav">
<li class=""><a href="cat=1">TestCat</a></li>
<li class="dropdown ">
//TestCat2 have to doing nothing always.
<a href="#" class="dropdown-toggle" data-toggle="dropdown">TestCat2</i></a>
<ul class="dropdown-menu">
<li><a class="nav-link" href="cat=3">TestSub</a></li>
</ul>
</li>
</ul>
当parent_id
大于 0..
如果有人可以帮助我,那就太好了..
谢谢大家。
解决方案
您可以采取几种方法:
- 构建一个数组
- 嵌套查询
- 递归
大批
这种方法构建了一个可以在视图中迭代的数据结构。工作示例
<?php
// get db connection...
// create categories array
$stmt = mysqli_query($con, "SELECT * FROM categories ORDER BY position ASC");
while( $row = mysqli_fetch_assoc($stmt)) {
// $category[ $row['parent_id] ][ $row['id'] ] = $row; // use if you need to access other fields in addition to name
$category[ $row['parent_id] ][ $row['id'] ] = $row['name'];
}
// other php stuff...
?>
<html>
... snip ...
<ul class="nav navbar-nav">
<?php foreach($category[0] as $id => $name): ?>
<?php if( isset( $category[$id]) ): ?>
<li class="dropdown ">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $name ?></a>
<ul class="dropdown-menu">
<?php foreach($category[$id] as $sub_id => $sub_name): ?>
<li><a class="nav-link" href="?cat=<?= $sub_id ?>" ><?= $sub_name ?></a></li>
<?php endforeach; ?>
</ul>
</li>
<?php else: ?>
<li class="">
<a href="?cat=<?= $id ?>"><?= $name ?></a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
嵌套查询
使用在幕后执行所有 sql 内容的虚构类最容易显示此方法。为了论证,我们将假设一个类Category
有一个名为的方法,该方法listByParent($parent_id)
返回具有指定 parent_id 的行列表。
<?php
$cat = new Category();
$topLevel = $cat->listByParent(0);
?>
<html>
... snip ...
<ul class="nav navbar-nav">
<?php foreach( $topLevel as $topRow ): ?>
<!-- note, this method is run on every iteration of top level categories -->
<?php $subRows = $cat->listByParent($topRow['id']) ?>
<?php if( count($subRows)): ?>
<li class="dropdown ">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $topRow['name'] ?></a>
<ul class="dropdown-menu">
<?php foreach($subRows as $row): ?>
<li><a class="nav-link" href="?cat=<?= $row['id'] ?>" ><?= $row['name'] ?></a></li>
<?php endforeach; ?>
</ul>
</li>
<?php else: ?>
<li class="">
<a href="?cat=<?= $topRow['id'] ?>"><?= $topRow['name'] ?></a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
递归
使用递归将允许您拥有“无限”级别的子类别。但是,在这种情况下,它的复杂程度似乎没有必要。但是如果你想追求它,请注意,最好的方法是为 html 制作一个可以以编程方式访问的模板,并$cat->findByParent()
成为关键参与者......
推荐阅读
- powershell - 为什么 PowerShell 重定向 >> 更改文本内容的格式?
- php - WordPress REST API 和 WP JSON API 有什么不同吗?
- c++ - Windows 是否处于文本输入模式?
- laravel - 如何为 Laravel Spark 自动注册 Vue 组件文件
- optimization - scipy's shgo optimizer fails to minimize variance
- scala - How do you overwrite array elements in HOCONS?
- python - 如何使用 sqlalchemy 和 postgres 使用嵌套的 jsonb 进行过滤
- scala - `Seq.contains` 因类型不匹配而失败的替代方法是什么?
- sql - Separate Comma Separated values into different rows
- bash - 对格式化(彩色)文本进行排序