2009-06-11 7 views
12

Tôi có một mảng gồm 200 mục. Tôi muốn xuất ra mảng nhưng nhóm các mục với một giá trị chung. Tương tự như phương thức GROUP BY của SQL. Điều này nên được tương đối dễ dàng để làm nhưng tôi cũng cần một số cho các mục nhóm.Mảng nhóm trong PHP

Có ai có cách hiệu quả để thực hiện việc này không? Điều này sẽ xảy ra trên mỗi tải trang vì vậy tôi cần nó để được nhanh chóng và khả năng mở rộng.

Tôi có thể kết xuất kết quả vào một thứ gì đó như Lucene hoặc sqlite sau đó chạy truy vấn trên tài liệu đó trên mỗi lần tải trang không?

Bất kỳ suy nghĩ nào cũng sẽ được đánh giá cao.

+3

Lucene hoặc sqlite có nhiều khả năng không hiệu quả hơn nhiều so với giải pháp PHP. –

+0

Kiểm tra điều này: cần giải quyết vấn đề của bạn chỉ đơn giản là http://pastebin.com/UJAqnKSs – eric

Trả lời

30

Chỉ cần lặp lại qua mảng và sử dụng mảng khác cho nhóm. Nó phải đủ nhanh và có lẽ nhanh hơn chi phí liên quan khi sử dụng sqlite hoặc tương tự.

$groups = array(); 
foreach ($data as $item) { 
    $key = $item['key_to_group']; 
    if (!isset($groups[$key])) { 
     $groups[$key] = array(
      'items' => array($item), 
      'count' => 1, 
     ); 
    } else { 
     $groups[$key]['items'][] = $item; 
     $groups[$key]['count'] += 1; 
    } 
} 
+0

máy chủ sql làm nhanh hơn hầu hết thời gian – GorillaApe

+0

+1 cho sol rất tốt :) –

+0

isset là rất quan trọng. đó là những gì tôi đã bỏ lỡ – user1494912

14
$groups = array(); 
foreach($items as $item) 
    $groups[$item['value']][] = $item; 
foreach($groups as $value => $items) 
    echo 'Group ' . $value . ' has ' . count($items) . ' ' . (count($items) == 1 ? 'item' : 'items') . "\n"; 
3

Dưới đây là một ví dụ nhanh:

$a = array(1, 2, 3, 1, 2, 3, 3, 2, 3, 2, 3, 4, 4, 1); 
$n = array_count_values($a); 
arsort($n); 

print_r ($ n);

Array ( [3] => 5 [2] => 4 [1] => 3 [4] => 2)

3
$aA = array_count_values(array(1,2,3,4,5,1,2,3,4,5,6,1,1,1,2,2)); 
$aB = array(); 
foreach($aA as $index=>$aux){ 
    array_push($aB,$index); 
} 
print_r($aB); 

Kết quả:

Array ([0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6) 
0
"$Switches" Array with [3] elements 
0  
    SwitchID 1 
    name k� 
    type output 
    displayAs button 
    value on 
    groupname group1 
1 Array [6] 
2 Array [6] 


// this will sort after groupname 

$result = array(); 
$target = count($Switches); 
for($i=0;$i<$target;$i++) 
{ 
    $groupname = $Switches[$i]["groupname"]; 

    $result[$groupname][] = $Switches[$i]; 
} 

// count amount of groups 
$groupCount = count($result); 

... hoặc tôi đã bỏ lỡ điều gì đó?

+1

Vui lòng sửa định dạng câu trả lời của bạn. –