【问题标题】:PHP: For each different key value, group togetherPHP:对于每个不同的键值,组合在一起
【发布时间】:2014-06-02 07:11:09
【问题描述】:

我有这个 mysql 示例表:

+----+---------------+-------+
| id | company       | value |
+----+---------------+-------+
| 1  | google        | 50    |
+----+---------------+-------+
| 2  | microsoft     | 24    |
+----+---------------+-------+
| 3  | google        | 12    |
+----+---------------+-------+
| 4  | microsoft     | 89    |
+----+---------------+-------+
| 5  | stackoverflow | 45    |
+----+---------------+-------+

并且我想将其打印出来,以便按公司分组:

<ul class="google">
  <li>50</li>
  <li>12</li>
</ul>
<ul class="microsoft">
  <li>24</li>
  <li>89</li>
</ul>
<ul class="stackoveflow">
  <li>45</li>
</ul>

这是我当前的代码:

$resultx = mysql_query();
$temp=0;   
$p = array();
while ($row = mysql_fetch_array($resultx)) {
   $p[$temp]['id']=$row['id'];
   $p[$temp]['company']=$row['company'];
   $p[$temp]['value']=$row['value'];
   $temp++;
}
foreach ($p as $obj) {
   echo '<ul class="'.$obj["company"].'"><li>'.$obj["value"].'</li></ul>';
};

但我的代码将整个公司打印在一起。

编辑:

我想将公司归入不同的 UL。 我会假设我必须在我的 foreach 中使用另一个 foreach。

【问题讨论】:

  • 在您的查询中使用GROUP BY
  • 我无法理解拥有近 3k 代表的人如何提出这样的问题 :( 您需要将值放入数组中
  • @Lashane - 也许 OP 在另一个领域有经验,比如 jQuery,他是 PHP 新手。
  • 是的,这两种方式都是可以接受的,但代码还是令人困惑。为什么要使用 2 个循环而不是 1 个? Ofir,我猜他想将每个结果列为单行。
  • @OfirBaruch 哪种语言都没有关系,它是关于一般编程和理解它是如何工作的,所以有1个代表的人提出了这样的问题 - 我可以理解,但这里是。 ..

标签: php mysql loops foreach


【解决方案1】:

在构建数组时,将数组的键设为公司名称或公司 ID。由于我在您的查询中没有看到公司 ID,因此我将使用名称。现在让它成为一个多用途数组,内部数组作为值。

$resultx = mysql_query();
$p = array();
while ($row = mysql_fetch_array($resultx)) {
   $p[$row['company']]['id']=$row['id'];
   $p[$row['company']]['company']=$row['company'];
   $p[$row['company']]['values'][]=$row['value'];
}
foreach ($p as $obj) {
    echo '<ul class="'.htmlspecialchars($obj["company"]).'">';
    foreach ($obj['values'] as $value) {
        echo '<li>'.htmlspecialchars($value).'</ul>';
    }
    echo '</ul>';
};

【讨论】:

  • 其实我喜欢你的回答比我的好,+1
【解决方案2】:

让我们开始吧:

SELECT * FROM `yourTableName` ORDER BY `company`

然后你这样做:

for($i = 0; $i<sizeOf($p); $i++)
{
 if ($p[$i] == 0 || $p[$i]['company'] != $p[$i-1]['company']) 
  echo '<ul class="'.$obj["company"].'">';
 ecoh '<li>'.$obj["value"].'</li>';
 if ($p[$i] == 0 || $p[$i]['company'] != $p[$i-1]['company']) 
  echo '</ul>';
}

【讨论】:

    【解决方案3】:
    $resultx = mysql_query();
    $temp=0;   
    $companies = array();
    while ($row = mysql_fetch_array($resultx)) {
       $companies[$row['company']][]=$row;
    }
    
    foreach ($companies as $company=>$values) {
       echo '<ul class="'.$company.'">';
       foreach($values as $value){
          echo '<li>'.$value["value"].'</li>';
       }
       echo'</ul>';
    }
    

    当然还有其他方法可以做到这一点,为了简单起见,我使用了 2 个不同的循环。

    【讨论】:

    • 我相信OP希望按公司对行进行分组,因为同一公司有多行。
    • 我想将行分组到不同的 UL 中
    【解决方案4】:
    $companies = array(); 
    //One array that will have companies' names as keys
    // and the value would be an array of values.
    
    $resultx = mysql_query();
    while ($row = mysql_fetch_array($resultx)) {
      $companies[ $row['company'] ][] = $row['value'];
    }
    
    foreach ($companies as $company => $values) { //Loop the companies
       echo '<ul class="'.$company.'">';
       foreach($values as $value) //Loop the values of that company
       {
        echo '<li>'.$value.'</li>';
       }
       echo '</ul>';
    }
    

    ** 没测试过。

    【讨论】:

      【解决方案5】:

      希望能解决你的问题

      $p = array(array());
      
      while ($row = mysql_fetch_array($resultx)) {
         $p[$row['company']][] = $row['value'];
      }
      
      
      foreach ($p as $key => $obj) {
         echo '<ul class="'.$key.'">';
      
          foreach ($obj as $val) {
              echo '<li>'.$val.'</li>';
          }
      
         echo '</ul>';
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多