Группировка массивов в PHP - PullRequest
13 голосов
/ 11 июня 2009

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

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

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

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

Ответы [ 5 ]

30 голосов
/ 11 июня 2009

Просто переберите массив и используйте другой массив для групп. Он должен быть достаточно быстрым и, вероятно, быстрее, чем накладные расходы при использовании 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;
    }
}
14 голосов
/ 11 июня 2009
$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 голосов
/ 14 сентября 2012
$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 ) 
3 голосов
/ 11 июня 2009

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

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

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

0 голосов
/ 29 мая 2013
"$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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...