Hace poco escribí un artículo mencionando lo útil que es usar funciones agregadas para agrupar datos en la Base de Datos en vez de hacerlo en PHP por ejemplo.
Hoy escribo su contraparte, una función en PHP que nos permite agrupar un arreglo (array)con cualquier cantidad de llaves (índices).
Por ejemplo veamos el siguiente arreglo de PHP. (La versión con más datos está en el script.)
Array ( [0] => Array ( [name] => Juan [color] => Azul [edad] => 24 ) [1] => Array ( [name] => Juan [color] => Rojo [edad] => 24 ) [2] => Array ( [name] => Juan [color] => Verde [edad] => 24 ) [3] => Array ( [name] => Pablo [color] => Azul [edad] => 25 ) [4] => Array ( [name] => Pablo [color] => Amarillo [edad] => 25 ) )
Digamos que lo queremos agrupar por el indice «name».
Con la función:
function groupArray($array,$groupkey) { if (count($array)>0) { $keys = array_keys($array[0]); $removekey = array_search($groupkey, $keys); if ($removekey===false) return array("Clave \"$groupkey\" no existe"); else unset($keys[$removekey]); $groupcriteria = array(); $return=array(); foreach($array as $value) { $item=null; foreach ($keys as $key) { $item[$key] = $value[$key]; } $busca = array_search($value[$groupkey], $groupcriteria); if ($busca === false) { $groupcriteria[]=$value[$groupkey]; $return[]=array($groupkey=>$value[$groupkey],'groupeddata'=>array()); $busca=count($return)-1; } $return[$busca]['groupeddata'][]=$item; } return $return; } else return array(); }
Podemos enviar un arreglo como primer parámetro y luego en el segundo parámetro indicar el indice por el que queremos agrupar. Por ejemplo agrupando por «name» tenemos:
Array ( [0] => Array ( [name] => Juan [groupeddata] => Array ( [0] => Array ( [color] => Azul [edad] => 24 ) [1] => Array ( [color] => Rojo [edad] => 24 ) [2] => Array ( [color] => Verde [edad] => 24 ) ) ) [1] => Array ( [name] => Pablo [groupeddata] => Array ( [0] => Array ( [color] => Azul [edad] => 25 ) [1] => Array ( [color] => Amarillo [edad] => 25 ) ) ) )
o podríamos agrupar por «edad»:
Array ( [0] => Array ( [edad] => 24 [groupeddata] => Array ( [0] => Array ( [name] => Juan [color] => Azul ) [1] => Array ( [name] => Juan [color] => Rojo ) [2] => Array ( [name] => Juan [color] => Verde ) ) ) [1] => Array ( [edad] => 25 [groupeddata] => Array ( [0] => Array ( [name] => Pablo [color] => Azul ) [1] => Array ( [name] => Pablo [color] => Amarillo ) ) ) )
Espero que les sea útil. Estamos en contacto!
Gracias por compartir esta función, me ayudó a solucionar un gran problema que tenía con unos arreglos, de verdad gracias!
Saludos cordiales;
Muuuuy Bueno ¡ Gracias