【问题标题】:Nested foreach loop cateogories and products嵌套的 foreach 循环类别和产品
【发布时间】:2019-12-14 04:46:42
【问题描述】:

我有以下表格:

分类: 类别id,类别名称

产品: id、category_id、product_name

我正在使用 bootstrap 4,我想将每个类别显示为手风琴标题,并在手风琴正文中列出属于该类别的所有产品。

使用 php 7

    function getProducts(){
        $db = new DB();
        $rows = $db->db_select("SELECT category.category_id, category.category_name, products.id, products.category_id, products.product_name
                FROM products 
                INNER JOIN category ON products.id = category.category_id 
                ORDER BY category.category_name 
                ");
        if($rows === false){
            $error = db_error();
        } else {
            return $rows;
        }
    }   

$data = new CORE();
$products = $data->getProducts();



<div class="accordion" id="accordionExample">
<? foreach($products as $p){ ?>
  <div class="card">
    <div class="card-header" id="headingOne">
      <h5 class="mb-0">
        <button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
          <? echo $p['category_name'] ?>
        </button>
      </h5>
    </div>

    <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordionExample">
      <div class="card-body">
        <? echo $p['product_name'] ?>
      </div>
    </div>
  </div>
<? } ?>
</div>

数据库数据:

【问题讨论】:

  • 你能告诉我们你的代码或你迄今为止尝试过的任何东西
  • 添加了代码,但不确定如何嵌套它以显示每个类别,然后显示其下的产品
  • 请展示您的数据库结构和一些虚拟数据以提供更好的答案
  • 添加数据库图片
  • 我可以看到您已经收到了很好的问题答案。那么您能否将答案标记为答案,并且您的投票对其他人也很有价值

标签: php mysql foreach


【解决方案1】:

如果将产品重新分类到类别,请尝试此查询

$this->db->join('products','products.category_id = categories.category_id')
->order_by('categories.category_id')->get('categories')->result_array();

【讨论】:

    【解决方案2】:

    您可以将查询更改为以下内容:

    SELECT category.category,GROUP_CONCAT(products.id, '|', products.name ) AS product FROMcategoryINNER JOINproductsON category.category_id=products.category_id GROUP BY category.category

    它会给你一个类似的结果:


    category product Hats 8|Snapback,9|Fitted Pants 6|Jogging,7|Cut offs Shirts 1|Polo,2|Long Sleeve,3|Vneck Shoes 5|Boots,4|Converse


    那么您所要做的就是将product 数组上的foreach 转换为split/explode 数据并显示它。首先split/explode 用逗号, 然后每个结果split/explode 用管道|。您仍将使用 2 个foreach,但使用一个 SQL 查询。

    【讨论】:

      【解决方案3】:

      首先我调用两个函数来获取类别和产品,如下所示。

      function getCategories(){
              $db = new DB();
              $rows = $db->db_select("SELECT category.category_id, category.category_name FROM Categories");
              if($rows === false){
                  $error = db_error();
              } else {
                  return $rows;
              }
          }   
          function getProducts(){
              $db = new DB();
              $rows = $db->db_select("SELECT products.id, products.category_id, products.product_name
                      FROM products ");
              if($rows === false){
                  $error = db_error();
              } else {
                  return $rows;
              }
          }   
      
      $data = new CORE();
      $categories = $data->getCategories();
      $products = $data->getProducts();
      

      然后我在 foreach 循环中递归地使用这些数组。关键是在这里我使用两个 1foreach` 循环,第一个循环等待直到第二个循环(内部)完成那里的过程。

      //Take the first value of array and then second value and so on.
      
           foreach($Categories as $Category){
      
           echo $Category['name'];
      
      //Take the first value of array and then second value and so on.
      
      foreach($Products as $Product){
      
      //Check the current category id with current product id. In here **category id dosent get changes untill products foreach loop completed**.
      
      if( $Category['category_id'] == $Product['category_id'] ) {
      
        echo $Product['name'];
      }
      }
      }
      

      【讨论】:

      • 如果还有什么问题请告诉我
      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2020-01-23
      • 2012-09-15
      • 2015-07-17
      相关资源
      最近更新 更多