2009-06-11 5 views
12

У меня есть массив из 200 предметов. Я хотел бы выводить массив, но группировать элементы с общим значением. Подобно методу GROUP BY SQL. Это должно быть относительно легко сделать, но мне также нужен счет для элементов группы.Группировка массивов в PHP

У кого-нибудь есть эффективный способ сделать это? Это произойдет при каждой загрузке страницы, поэтому мне нужно, чтобы она была быстрой и масштабируемой.

Мог ли я предварять сбрасывать результаты на что-то вроде Lucene или sqlite, а затем запускать запрос на этот документ при каждой загрузке страницы?

Любые мысли были бы весьма благодарны.

+3

Lucene или sqlite, скорее всего, гораздо более неэффективны, чем решение PHP. –

+0

Проверьте это: нужно решить вашу проблему просто http://pastebin.com/UJAqnKSs – eric

ответ

30

Просто перебирайте массив и используйте другой массив для групп. Он должен быть достаточно быстрым и, вероятно, быстрее, чем накладные расходы при использовании sqlite или аналогичного.

$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

sql-серверы делают это быстрее в большинстве случаев – GorillaApe

+0

+1 для очень хорошего sol :) –

+0

isset очень важен. вот что я пропустил – 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

Вот краткий пример:

$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 ($ п);

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

Результат:

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

... или я что-то пропустил?

+1

Исправьте форматирование своего ответа. –

Смежные вопросы