Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/02/2012, 15:20
ocp001a
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
[APORTE] Ordenar array multidimensional

La siguiente función permite ordenar un array multidimensional asociativo. Y cuando digo multidimensional es que realmente ordena arrays irregulares con tantos índices que otros métodos como multisort no funcionan.

La función puede recibir tres parámetros: el array, la columna o índice por la cual se quiere ordenar y opcionalmente el orden, ascendente o descendente. Por defecto ordena de forma ascendente.

Código PHP:
Ver original
  1. function ordena_mat($mat,$col,$aod="ASC"){
  2.     foreach($mat as $k =>$val){//recorre la matriz o array
  3.         if($k!=$col) //si la clave actual ($k) NO es la indicada para ordenar
  4.             $ord[$k]=$val; //guarda en un arreglo temporal asociativo el valor.
  5.         else
  6.             return $mat; //si lo es, regresa la matriz.
  7.     }
  8.  
  9.     if($aod=="ASC") //si el ordenamiento es ASCENDENTE
  10.         arsort($ord); //ordena ascendentemente
  11.     else
  12.         asort($ord);//caso contrario, ordena de forma descendente.
  13.  
  14.     foreach($ord as $k=>$nms)//recorre el arreglo temporal
  15.         $mat2[$k]=$mat[$k];//crea una segunda matriz matriz temporal con los valores de la primera, pero ya ordenados
  16.  
  17.     foreach($mat2 as $k =>$val){//recorre la segunda matriz
  18.         if(is_array($val))//si contiene otra matriz o arreglo
  19.             $val=ordena_mat($val,$col,$aod);//vuelve a llamar a la función ordenar para dicho arreglo
  20.         $mat2[$k]=$val;//y guarda el resultado ordenado en la matriz temporal
  21.     }
  22.     return $mat2;//finalmente regresa la matriz temporal ya ordenada
  23. }
  24. //no creo que falte aclararlo, pero se manda a llamar así:
  25.  
  26. $mi_array=ordena_mat($mi_array,'indice','ASC');
  27. //o
  28. $mi_array=ordena_mat($mi_array,'indice','DESC');

Posiblemente se pueda optimizar, pero la dejo para los que necesiten una función de ordenamiento y no tengan mucho tiempo para hacer alguna