#php #loops #categories
#php #циклы #Категории
Вопрос:
Я показываю категории в меню. Некоторые категории имеют подкатегории.
функция для получения родительских категорий
function get_parent_category(){
$query="select * from blog_categories where parent_id=0
ORDER BY
CASE id
WHEN '2' THEN 1
WHEN '1' THEN 2
WHEN '3' THEN 3
ELSE id
END";
$rows=array();
$result=$this->query($query);
while($row=$this->fetch_array($result)){
$row['url']=$this->get_cat_url($row);
$rows[]=$row;
}
return $rows;
}
Функция для подкатегорий
function get_child_category(){
$query="select * from blog_categories where parent_id!=0";
$rows=array();
$result=$this->query($query);
while($row=$this->fetch_array($result)){
$row['url']=$this->get_cat_url($row);
$rows[]=$row;
}
return $rows;
}
Отображение на странице следующим образом:
<ul class="nav navbar-nav">
<li><a href="<?php echo BASE_URL ?>">Home</a></li>
<?php
foreach($this->parent_category as $cat){
foreach($this->child_category as $child_cat){
if($cat['id']==$child_cat['parent_id']){
?>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#"><?php echo $cat['name'];?>
<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#"><?php echo $child_cat['name']?></a></li>
</ul>
</li>
<?php
}elseif($cat['parent_id']==0){
?>
<li><a href="<?php echo $cat['url']?>"><span><?php echo $cat['name'];?></span></a></li>
<?php
}
?>
<?php }}?>
Вывод и проблема
Основной круг категории красного цвета — это seerah, который имеет две подкатегории. отображается два раза для первого в выпадающем списке одной подкатегории, а во второй раз отображается вторая подкатегория.
Структура БД
Чего я хочу:
Я хочу показать каждую подкатегорию в каждой родительской категории без повторения, как я могу этого добиться?
Комментарии:
1. Вы использовали var_dum для обеих строк $ из get_child_category() и get_parent_category() , чтобы увидеть результат sql?
2. @shojaeddin да, но как это решит мою проблему?
Ответ №1:
Вот как я справился с проблемой
<?php
foreach($this->parent_category as $cat){
$html = '';
foreach($this->child_category as $child_cat){
if($cat['id']==$child_cat['parent_id']){
$html .= '<li><a href="'.$child_cat['url'].'">' . $child_cat['name'] . '</a></li>';
// here is all child categories are saved in var.
}
}
if ($html == '') {
?>
<li><a href="<?php echo $cat['url']?>"><span><?php echo $cat['name'];?></span></a></li>
<?php
} else {
?>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#"><?php echo $cat['name'];?>
<span class="caret"></span></a>
<ul class="dropdown-menu">
<?php echo $html; ?> // here is displayed under parent category
</ul>
</li>
<?php
}
}
?>
Вывод
Комментарии:
1. Действительно спасибо, есть ли какое-либо обновленное решение?
Ответ №2:
Мне кажется, вы неправильно разделили свой html и циклы здесь:
foreach($this->parent_category as $cat){
foreach($this->child_category as $child_cat){
if($cat['id']==$child_cat['parent_id']){
?>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#"><?php echo $cat['name'];?>
<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#"><?php echo $child_cat['name']?></a></li>
</ul>
</li>
Обычно всякий раз, когда у вас есть цикл, у вас должен быть некоторый вывод перед запуском любого вложенного цикла. В вашем случае цикл первого уровня посвящен категориям, которые должны стать <li>
частью родительского главного меню <ul>
.
Я думаю. Вам нужно преобразовать этот фрагмент в:
foreach($this->parent_category as $cat){ ?>
<li ...>
...
<ul ...> <?php
foreach($this->child_category as $child_cat){ ?>
<li>...</li> <?php
} ?>
</ul>
</li> <?php
}
Ответ №3:
если у вас нет повторяющегося значения в $rows, почему вы снова используете эту часть для $cat [‘name’]?
elseif($cat['parent_id']==0){
?>
<li><a href="<?php echo $cat['url']?>"><span><?php echo $cat['name'];?></span></a></li>
<?php
}
когда в первой части foreach вы создаете
<a class="dropdown-toggle" data-toggle="dropdown" href="#"><?php echo $cat['name'];?>