Категории повторяются для каждой подкатегории

#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'];?>