2016-07-27 6 views
-1

어떻게 든 효과적으로 foreach 루프에서 항목을 그룹화하여 효과적으로 표시 할 수 있습니다.PHP foreach 루프의 항목 그룹화

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

나는 GROUP_ID 2 사용자가 당신이 질문을 이해 바랍니다 GROUP_ID 1 <div class="group1">Username John</div>

<div class="group2">Username 1: Mark, Username 2: Steve</div> 사용자에 함께 표시 할 예를 들어 나는 다음과 같은 MySQL의 테이블이있는 경우.

+2

지금까지 해보신 것은 무엇입니까? –

+0

나는 아무 것도 시도하지 않았다, 나는 그걸하는 법을 모른다. – Barba

+1

그때 너도 가지고있다. –

답변

1

쿼리를 group_id으로 주문한 다음 변경 사항을 추적하면 쉽게 처리 할 수 ​​있습니다. 이런 식으로 뭔가 :

$query = "SELECT * FROM table ORDER BY group_id"; 
$results = $mysqli->query($query); 
$lastGroup = 0; 
while ($row = $results->fetch_assoc()) 
{ 
    if ($row['group_id'] != $lastGroup) 
    { 
     // If there is already a div open we need to close it, so if 
     // last group > 0 then a div has been opened. 
     echo ($lastGroup > 0 ? '</div>' : '') . '<div class="group' . $row['group_id'] . '">'; 
    } 
    $lastGroup = $row['group_id']; 
    echo $row['username'] . '<br>'; 
} 
// close the last open div 
echo '</div>'; 

은 또한 당신은 그룹의 모든 사용자 이름을 다시 얻기 위해 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

는 2 차원 배열을 만듭니다

$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)