【问题标题】:PHP MYSQL Array and sortPHP MYSQL 数组和排序
【发布时间】:2015-09-25 16:05:25
【问题描述】:

所以,我有一个数据库表,其中每个客户最多有 8 个单独的类别选项。

例子:

company_name | category_1 | category_2 | category_3
****************************************************
My Company   | computers  | parts      | electronics

ect... 多达八个类别选项。我需要做的是获取列表中的类别,并在每个类别项下列出所有具有该类别的公司。我将类别放入一个数组中,但我将它们全部放在一个 foreach 循环中,这会给我重复。我不想列出重复项,我只想列出一次并将所有公司归入该类别。

喜欢:

计算机
公司名称

零件
公司名称

电子产品
公司名称

等等……

我目前的代码:

$sql = $wpdb->get_results( "SELECT * FROM $table_name");

echo '<ul>';

foreach ($sql as $cat){
    $cats[0] = $cat->category_1.' '.$cat->category_2.' '.$cat->category_3.' '.$cat->category_4.' '.$cat->category_5.' '.$cat->category_6.' '.$cat->category_7.' '.$cat->category_8;
    $totalCats = $cats[0];
    echo '<li>'.$totalCats.'</li>';
}

echo '</ul>';
}// End of foreach loop

这会给我以下信息:

  • 电脑零件
  • 计算机电子产品
  • 电子零件

等...每个数据库条目取决于公司选择了多少类别。

任何帮助将不胜感激!

【问题讨论】:

    标签: php mysql arrays sorting


    【解决方案1】:

    我没有数据集来测试它,但这应该可以。 我们从数据集中创建一个多维数组,如下所示:

    [comp][0] = company A
          [1] = company B
          ...
    [elec][0] = company A
          [1] = company C
          ...
    [part][0] = company Y
          [1] = company Z
          ...
    

    然后我们对其进行迭代以将其打印出来。

    <?php
    $cats = array();
    
    // loop through rows
    foreach($sql as $cat) {
    
       // loop through row categories
       for($i=1; $i<=8; ++$i) {
    
          // column name
          $column = 'category_'.$i;
    
          // column has data
          // $cats[category][irrelevant index] = company name
          if($cat->$column !== null && $cat->$column !== '') {
             $cats[$cat->$column][] = $cat->company_name;
          }
       }
    }
    
    // sort categories
    ksort($cats);
    
    echo '<ul>';
    
    // loop though categories
    foreach($cats as $catname=>$cat) {
    
       // sort companies in category
       sort($cat);
    
       // category name
       echo '<li>'.$catname.'</li><ul>';
    
       // loop through companies
       foreach($cat as $company) {
          echo '<li>'.$company.'</li>';
       }
    
       echo '</ul>';
    }
    echo '</ul>';
    ?>
    

    最好将类别存储在单独的表中并从那里开始,使用JOIN 检索相关的公司名称。它还需要更少的代码来按照你想要的方式打印出来。

    更新 2015-07-09 10:02 +0000

    将列数据测试改为$cat-&gt;$column !== ''

    更新 2015-07-09 10:49 +0000

    根据 wpdb 结果结构将列数据测试更改为$cat-&gt;$column !== null &amp;&amp; $cat-&gt;$column !== ''

    【讨论】:

    • 这几乎是对的!我试过了,我列出了它们下所有公司的类别,但在此之上,我列出的公司与它们在类别中的次数一样多。参见示例:pastebin.com/Wzxvwduw
    • 您可以在我的代码末尾添加print_r($cats); 并发布其输出吗?
    • 正是我所怀疑的。只需要运行一些测试来看看如何修复它。
    • 感谢更新,但它仍然显示。 pastebin.com/gHs1XWxH
    【解决方案2】:

    我认为您需要为类别创建单独的表

    For eg:-
    
    table companies
    
    company_id | company_name
    
    table categories
    
    category_id | company_id | category_name
    
    So your query will comes like
    
    $query = "SELECT * FROM companies comp RIGHT JOIN categories cate ON comp.company_id=cate.company_id";
    

    通过此您将获得公司详细信息和类别数组,希望这是更好的方法

    【讨论】:

    • 我建议使用 3 个表:"companies" (id, name), "categories" (id, name), "companies_categories" (company_id, category_id)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多