2009-06-11 13 views
12

Tengo una matriz de 200 elementos. Me gustaría dar salida a la matriz pero agrupar los elementos con un valor común. Similar al método GROUP BY de SQL. Esto debería ser relativamente fácil de hacer, pero también necesito un conteo para los elementos del grupo.Agrupación de matrices en PHP

¿Alguien tiene una manera eficiente de hacer esto? Esto sucederá en cada carga de página, así que necesito que sea rápido y escalable.

¿Podría haber vertido los resultados en algo así como Lucene o sqlite y luego ejecutar una consulta en ese documento en cada carga de página?

Cualquier pensamiento sería muy apreciado.

+3

Lucene o sqlite son probablemente mucho más ineficientes que una solución de PHP. –

+0

Verifique esto: debería resolver su problema simplemente http://pastebin.com/UJAqnKSs – eric

Respuesta

30

Simplemente itere sobre la matriz y utilice otra matriz para los grupos. Debería ser lo suficientemente rápido y probablemente más rápido que la sobrecarga involucrada al usar sqlite o similar.

$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

servidores sql lo hacen más rápido la mayor parte del tiempo – GorillaApe

+0

+1 para muy buen sol :) –

+0

isset es muy importante. eso es lo que perdí – 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

Aquí está un ejemplo rápido:

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

Resultado:

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

... o perdí algo?

+1

Por favor, corrija el formato de su respuesta. –