2016-07-27 34 views
-1

我想以某种方式在foreach循环中对项目进行分组,因此我可以有效地显示它们。例如,如果我有以下MySQL表:在PHP foreach循环中对项目进行分组

user_id username group_id 
1  John  1 
2  Mark  2 
3  Steve 2 

我想在GROUP_ID 2的用户显示在一起<div class="group2">Username 1: Mark, Username 2: Steve</div>和用户GROUP_ID 1 <div class="group1">Username John</div>

我希望你能理解这个问题。

+2

到目前为止您尝试了什么? –

+0

我什么也没试,我也不知道该怎么做 – Barba

+1

那你也有。 –

回答

1

您可以通过group_id订购您的查询,然后跟踪其更改时间,轻松完成此操作。类似这样的:

​​

或者,您可以使用MySQL GROUP_CONCAT函数来取回组中的所有用户名。使用此:

$query = "SELECT group_id, 
GROUP_CONCAT(username) as users 
FROM table 
GROUP BY group_id"; 

$results = $mysqli->query($query); 
while ($row = $results->fetch_assoc()) 
{ 
    echo '<div class="group' . $row['group_id'] . '">' . $row['users'] . '</div>'; 
} 
0

创建一个二维数组:

$users; 

的foreach结果行$行:

$users[$row->group_id][$row->user_id] = $row->username; 

然后:

foreach($users as $group_id -> $group_users) { 
    echo '<div class="' . $group_id . '">'; 
    foreach($group_users as $user_id -> $username) { 
     echo " Username: "; 
     echo $user_id; 
     echo " :"; 
     echo $username; 
    } 
    echo "</div>"; 
} 
+1

'+'不是在PHP中使用的正确的连接器,它应该是''' – Styphon

+0

的确。感谢您的更正。 –

0
强烈推荐使用您的查询使用g mysql GROUPing功能所以你不必机械地做到这一点。但是,如果出于任何原因,您的结果集看起来像您发布的数据,您希望循环访问并按照您所描述的方式显示记录;您可以遍历行的阵列,将同一组中的所有用户捆绑到一个唯一的子阵列中,然后为显示器运行一个 foreach循环。下面的代码演示如何举一个例子:
<?php 

     // SIMULATE AN TO REPRESENT THE RECORDS FROM THE DB TABLE... 
     $array = array(
      array(
       "user_id" => 1, 
       "username" => "John", 
       "group_id" => 1, 
      ), 
      array(
       "user_id" => 2, 
       "username" => "Mark", 
       "group_id" => 2, 
      ), 
      array(
       "user_id" => 2, 
       "username" => "Steve", 
       "group_id" => 2, 
      ), 
     ); 

     // CREATE AN ARRAY FOR USE IN GROUPING USERS WITH THE SAME group_id 
     $groupArray = array(); 

     // WALK THE SIMULATED ARRAY (IN YOUR CASE YOUR ROWS) 
     // AND BUILD UP THE $groupArray 
     $result  = array_walk($array, function($data) use(&$groupArray) { 
      if(!array_key_exists($data['group_id'], $groupArray)){ 
       $groupArray[$data['group_id']][]  = $data; 
      }else{ 
       if(!in_array($data, $groupArray)){ 
        $groupArray[$data['group_id']][] = $data; 
       } 
      } 
     }); 

     // CREATE AN OUTPUT TO HOLD THE HTML CONTENT FOR DISPLAY: 
     $output  = ""; 

     // LOOP THROUGH THE $groups AND BUILD UP YOUR DATA... 
     foreach ($groupArray as $groupID=>$groups){ 
      $output.= "<div class='group" . $groupID . "'>" . PHP_EOL; 
      $output.= "<h3 class='group-users'>Users in Group {$groupID}</h3>" . PHP_EOL; 

      foreach($groups as $group){ 
       $output.= "<span class='user-name'>Username: " . $group['user_id'] . ": {$group['username']},</span><br />" . PHP_EOL; 
      } 
      $output.= "</div>" . PHP_EOL; 
     } 


     var_dump($output); 
     // echo $output; 



     // THE var_dump($output) PRODUCES::   
     string '<div class='group1'> 
        <h3 class='group-users'>Users in Group 1</h3> 
        <span class='user-name'>Username: 1: John,</span><br /> 
       </div> 
       <div class='group2'> 
       <h3 class='group-users'>Users in Group 2</h3> 
        <span class='user-name'>Username: 2: Mark,</span><br /> 
        <span class='user-name'>Username: 2: Steve,</span><br /> 
       </div> 
       ' (length=317)