首页 > 解决方案 > 动态子类别未正确显示

问题描述

我的网站中有一个侧导航,我想从我的数据库中动态显示类别和子类别的列表。我的类别可以正确显示为列表项,但我的子类别显示不正确。现在它只在最底部的类别中显示子类别,而不是在每个类别下拉列表中显示列表。我尝试将 sub_category 函数放在 DELIMETER 中,但这没有用,我查看了其他问题,但似乎没有一个符合我的需要。所以我的问题是我如何格式化这个,以便每个类别都显示一个子类别列表?这是我的功能代码:

    function get_categories(){
      $query = query("SELECT * FROM categories");
      confirm($query);

      while ($row = fetch_array($query)) {
        $category_links = <<<DELIMETER
        <li><a href="category.php?id={$row['cat_id']}" >{$row['cat_title']}</a>
        <div class="megadrop">

    DELIMETER;
    echo $category_links;
      }
}


    function get_sub_categories(){
      $query = query("SELECT * FROM sub_categories");
      confirm($query);

      while ($row = fetch_array($query)) {

        $category_links = <<<DELIMETER
        <li><a href="sub_categories.php?id={$row['cat_id']}" >{$row['sub_title']}</a></li>
    DELIMETER;
    echo $category_links;
      }

    }

这是侧面导航页面:

<div class="col-md-3">
  <ul class="menu">

    <?php  get_categories();?>

        <div class="col">

          <ul>
            <?php      get_sub_categories(); ?>
            </li>

          </ul>
      </div>
    </li>
  </ul>
</div>

感谢您的任何帮助。

标签: php

解决方案


甘道夫,它不能按照你想要的方式工作,因为你是一个接一个地运行这两个循环而不是交织在一起。

这基本上是:

> get_categories()
<ul class="menu">
  <li> __CAT0__
  <li> __CAT1__
  <li> __CAT2__
  ...
    <div class="col">
      <ul>
        <li> __SUBCAT0.0__
        <li> __SUBCAT0.1__
        <li> __SUBCAT1.0__
        <li> __SUBCAT2.0__
        ...

你看出它有什么缺陷了吗?答案在于创建一个适当的数据类型,它能够表示您所追求的嵌套结构(您最肯定想要的是一个多维数组)。

那么让我们看看我们能做些什么:

<?php

function get_sub_categories() {
   $categories = [];

   $query = query("SELECT * FROM sub_categories");
   confirm($query);

   while ($row = fetch_array($query)) {
     $parent = $row['parent_id'];
     $categories[$parent][] = $row;
   }

   return function($parent) use ($categories) {
     return isset($categories[$parent])
       ? $categories[$parent]
       : [];
     };
   };
}

function get_categories(){
  $categories = [];

  $query = query("SELECT * FROM categories");
  confirm($query);

  $findSubCategoriesFor = get_sub_categories();

  while ($row = fetch_array($query)) {
    $id = $row['cat_id'];

    $categories[$id] = [
      'category' => $row,
      'children' => $findSubCategoriesFor($id),
    ];
  }

  return $categories;
}

现在,正确渲染多级导航所需要做的就是get_categories()使用嵌套循环(即类别 -> 子项、类别 -> 子项...)一一调用和渲染每个条目


推荐阅读