У меня есть массив из 200 предметов. Я хотел бы выводить массив, но группировать элементы с общим значением. Подобно методу GROUP BY SQL. Это должно быть относительно легко сделать, но мне также нужен счет для элементов группы.
У кого-нибудь есть эффективный способ сделать это? Это произойдет при каждой загрузке страницы, поэтому мне нужно, чтобы она была быстрой и масштабируемой.
Могу ли я предварять сбрасывать результаты во что-то вроде Lucene или sqlite, а затем запускать запрос на этот документ при каждой загрузке страницы?
Любые мысли были бы весьма признательны.
Просто перебирайте массив и используйте другой массив для групп. Он должен быть достаточно быстрым и, вероятно, быстрее, чем накладные расходы при использовании 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; } }
$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";
Вот краткий пример:
$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)
$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 )
"$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);
… или я что-то пропустил?