2011-06-23 19 views
5

Tener problemas para encontrar la combinación correcta de conteo y foreach para una matriz multidimensional.PHP - Crear una matriz multidimensional a través de un bucle basado en un recuento

que estoy haciendo actualmente lo siguiente para crear una matriz asociativa de resultados devuelto de mi db:

$sql = "SELECT g.id, g.shortname FROM games g ORDER BY g.id ASC"; 
     $query = $this->db->query($sql); 

     if($query->num_rows() > 0): 
      foreach($query->result() as $row): 
       $data[$row->id] = $row->shortname; 
      endforeach; 
     return $data; 
     else: 
      return false; 
     endif; 

Por supuesto, esto produce la siguiente matriz (que funciona bien; código de semi-falso):

array ([1] => CoolGame, [2] => AnotherGame, [3] => BetterGame, [4] => UglyGame) 

.... y así sucesivamente

Pero lo que yo quiero hacer es romper automáticamente resultados (en base a un recuento var/limitador) en grupos a través de una matriz multidimensional de este modo:

array (Group 1 => 
     array([1] => CoolGame [2] => AnotherGame), 
     Group 2 => 
     array([3] => BetterGame [4] => UglyGame) 
) 

Así que en ese ejemplo, mi $depth_count = 2;

En caso de que a alguien le interesa, yo estoy haciendo esto para trabajar con <optgroup> etiquetas generadas automáticamente para un multi seleccionar a través de la función de CI forma de ayudante form_multiselect(). Necesito ayuda para ajustar mi PHP para permitir esto. ¡Gracias!

Respuesta

7

Puede utilizar el método array_chunk de php. Observe su uso en el código modificado a continuación:

if($query->num_rows() > 0): 
    foreach($query->result() as $row): 
     $data[$row->id] = $row->shortname; 
    endforeach; 

    $data = array_chunk($data, 2); 

return $data; 
+0

+1, Touche. Me olvidé de esa función. De hecho, me gusta eso, si se trata de una agrupación arbitraria. –

+0

+1 array_chunk (función muy útil mientras se juega con arrays :)) –

+0

Cosas geniales. Funciona perfectamente y sería la solución completa, excepto por el hecho de que crea claves de matriz indexadas numéricamente. Probablemente pueda iterar sobre la matriz después del hecho y anteponer "Grupo" a cada nombre de clave. – k00k

1
$nGroup = 1; $curGroup = ''; 
$nRow = 0; 
foreach ($query->result() as $row){ 
    if ($nRow++ % 2 == 0){ // change 2 to your limiter 
    $curGroup = 'Group ' . $nGroup++; 
    $data[$curGroup] = array(); 
    } 
    $data[$curGroup][$row->id] = $row->shortname; 
} 

Algo así? Mantenga un registro de la fila en la que se encuentra, el grupo actual al que agrega y el nombre del grupo. Luego, cada 2do (o enésimo) conjunto, cambie de grupo.

Cuestiones relacionadas