所以嘿,正如标题所说,我正在寻找方法来创建带有子类别的类别。我一直在 stackoverflow 中寻找我需要的东西,但没有一个对我有帮助的例子..
这是我的 table 的样子 所以我知道我想要什么和需要什么,但我不知道如何才能做到这一点
- 我必须
从类别中选择 * 按位置 ASC 排序
- 我必须检查
parent_id
是否大于 0。 - 我必须从导航栏中删除
parent_id
,并仅在类别名称下通过下拉菜单
显示它们。
但我不知道如何才能做到这一切..
以下是我如何仅选择我的类别并显示它们
$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时..
如果有人能帮助我,那就太好了..
谢谢大家。
最佳答案
您可以采取多种方法:
- 构建数组
- 嵌套查询
- 递归
数组
此方法构建了一个可以在 View 中迭代的数据结构。 Working example
<?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()
是关键角色...
关于php - 如何使我的类别 mysql 表中的下拉菜单仅在parent_id 不为 0 时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827043/