PHP MYSQL 数组和排序

3

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

例如:

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

我需要将多达八个类别选项的公司列表化,并在每个类别项目下列出该类别中的所有公司。我已经将类别放入了一个数组中,但是使用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

这样做会给我以下结果:
  • 计算机零件
  • 计算机电子产品
  • 电子元器件

等等... 对于每个公司选择的类别数量,都会有相应的数据库条目。

非常感谢您的帮助!

2个回答

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->$column !== '' 更新2015-07-09 10:49 +0000
根据wpdb结果结构,将列数据测试更改为$cat->$column !== null && $cat->$column !== ''

这几乎是完全正确的!我尝试了一下,我得到了列出所有公司的类别列表,但在此之上,我得到了按类别重复列出的公司。请参见示例:http://pastebin.com/Wzxvwduw - Tyler Robinson
你能在我的代码末尾添加 print_r($cats); 并发布它的输出吗? - spenibus
正是我所怀疑的。只需要运行一些测试来看如何修复它。 - spenibus
谢谢更新,但它仍然显示。http://pastebin.com/gHs1XWxH - Tyler Robinson
让我们在聊天中继续这个讨论。点击此处进入聊天室 - spenibus

1
我认为你需要为类别创建单独的表格。
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";

通过这个,您将获得公司详情和类别数组,希望这是更好的实现方式。


1
我建议使用3个表格: "公司" (id, 名称), "类别" (id, 名称), "公司_类别" (公司_id, 类别_id)。 - spenibus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接