动态子类别无法正确显示

时间:2018-07-30 18:24:36

标签: php

我的网站中有一个导航栏,我想动态显示数据库中的类别和子类别的列表。我的类别可以正确显示为列表项,但是子类别显示的方式不正确。现在,它仅显示最底部类别中的子类别,而不是在每个类别下拉列表中显示列表。我尝试将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>

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Gandalf,它无法按您想要的方式工作,因为您是一个接一个地运行这两个循环,而不是相互缠绕。

这实际上是:

> 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()并使用嵌套循环逐个呈现每个条目(即,类别->子项,类别->子项...)