Группировка массивов в PHP

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

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

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

Мы будем очень признательны за любые мысли.


person GivP    schedule 11.06.2009    source источник
comment
Lucene или sqlite, скорее всего, гораздо менее эффективны, чем решение PHP.   -  person Ionuț G. Stan    schedule 11.06.2009
comment
Проверьте это: ваша проблема должна быть решена просто pastebin.com/UJAqnKSs   -  person eric    schedule 04.04.2014


Ответы (4)


Просто переберите массив и используйте другой массив для групп. Это должно быть достаточно быстро и, вероятно, быстрее, чем накладные расходы, связанные с использованием 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;
    }
}
person Ferdinand Beyer    schedule 11.06.2009
comment
SQL-серверы делают это быстрее в большинстве случаев - person GorillaApe; 01.05.2012
comment
Иссет очень важен. это то, что я пропустил - person user1494912; 07.08.2014

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

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

Массив ( [3] => 5 [2] => 4 [1] => 3 [4] => 2 )

person racerror    schedule 11.06.2009

$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 ) 
person Marcos Nakamine    schedule 14.09.2012

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

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

person SuperDude    schedule 28.05.2013