【问题标题】:group mysql results in nested array分组 mysql 导致嵌套数组
【发布时间】:2016-12-13 17:15:57
【问题描述】:

我有一个这样的 MySQL 查询:

SELECT c.id
     , c.company_name
     , b.brand_id
     , b.brand_name 
  FROM companies as c 
  JOIN brands AS b 
    ON c.id = b.company_id;

返回一个像这样的表:

结果存储在$items

我希望能够使用foreach 循环来显示如下结果:

<ul>
  <li><b>adidas plc</b></li>
  <li>adidas</li>
</ul>
<ul>
  <li><b>coca-cola</b></li>
  <li>coke</li>
  <li>dr pepper</li>
  <li>7up</li>
</ul>
<ul>
  <li><b>ebay</b></li>
  <li>Duobam</li>
</ul>

如何仅使用上述连接查询来完成此操作?我可以通过首先查询公司表然后对品牌表上的每一个进行新的查询来做到这一点,但是对于成千上万的公司和多个品牌来说,这会导致太多的查询。

          foreach($items as $item){
            echo '
            <ul>
              <li><b>'.$item['company_name'].'</b></li>
              <li>'.$item['brand_name'].'</li>
            </ul>
            ';
          }

【问题讨论】:

  • 只需循环遍历结果,如果公司名称更改关闭并打开&lt;ul&gt;
  • 尽管如此它将/可以工作。这是做类似事情的通常方法。在一个循环中存储当前的 company_name,在下一个循环中与实际存储的比较。如果不同-> 新建一个表头,如果相同则输出品牌。
  • 你有示例代码吗?
  • 你需要展示你目前拥有的 PHP。您正在加载查询结果吗?变量名是什么?等等。
  • @MikeMeade 你还没有看到答案,是吗?

标签: php mysql arrays foreach


【解决方案1】:

这是做这些事情的一种方式:

<?php

$brands = Array (
Array (  'company_name' => 'adidas',
         'brand_name' => 'adidas' ),
Array (  'company_name' => 'coca-cola',
         'brand_name' => 'coke' ),
Array (  'company_name' => 'coca-cola',
         'brand_name' => 'dr pepper' ),
Array (  'company_name' => 'coca-cola',
         'brand_name' => 'sprite' ),
Array (  'company_name' => 'ebay',
         'brand_name' => 'duobam' ),
);


$old_company = "";   // storage for current company_name


foreach($brands as $brand) {
    if($old_company!=$brand['company_name']) {  // if it changed, show it
        if($old_company!='') echo "</ul>";
        echo "<ul><li><b>".$brand['company_name']."</b></li>";
    }
    echo "<li>".$brand['brand_name']."</li>";
    $old_company=$brand['company_name'];  // update company_name
}
echo "</ul>";  // final ul closure

?>

同样的技术适用于表格、表格行等...
注意数据源必须按公司名称排序/分组!

【讨论】:

  • 我遇到了
  • 相互嵌套的问题?
  • 我的小提琴里没有那个。确定你没有错过某个地方的/
  • 【解决方案2】:

    将结果按公司名称顺序排序,然后在返回的公司名称发生变化时放入每个公司组的标题部分。

    您可以使用类来列出这些部分。每次公司名称更改时创建一个新实例,删除任何现有实例。构造函数和析构函数中的第一行和最后一行都可以放出来。

    <?php
    
    $result = $db->query("SELECT c.id,
                                    c.company_name,
                                    b.brand_id,
                                    b.brand_name 
                            FROM companies as c 
                            JOIN brands AS b 
                            ON c.id=b.company_id
                            ORDER BY c.company_name,
                                    b.brand_name");
    if($result)
    {
        $prev_company_name = '';
        while ($row = $result->fetch_assoc())
        {
            if ($prev_company_name != $row['company_name'])
            {
                if ($prev_company_name != '')
                {
                    unset($company_line);
                }
                $prev_company_name = $row['company_name'];
                $company_line = new company_out($row['company_name']);
            }
            $company_line->out_line($row['brand_name'])
        }
        if ($prev_company_name != '')
        {
            unset($company_line);
        }
    }
    
    
    class company_out
    {
    
        public function __CONSTRUCT($company)
        {
            echo "<ul>";
            echo "<li><b>$company</b></li>";
        }
    
        public function __DESTRUCT()
        {
            echo "</ul>";
        }
    
        public function out_line($line)
        {
            echo "<li>$line</li>";
        }
    }
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签