Tema: FAQ's de PHP
Ver Mensaje Individual
  #63 (permalink)  
Antiguo 20/05/2003, 18:01
Avatar de BVis
BVis
 
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 22 años
Puntos: 0
Ordenar un array BIDIMENSIONAL por uno o varios campos (columnas).

Con esta función se puede ordenar un array BIDIMENSIONAL por uno o varios campos (columnas), tanto ascendentemente como descendentemente.

La forma de llamarla es:

Código PHP:
$array_ordenado ordenar_array($array_a_ordenarprimer_campo_por_el_que_ordenarasc_desc [,siguiente_campo_por_el_que_ordenarasc_desc]*) ; 
Donde $array_a_ordenar tiene la siguiente escructura:
Código PHP:
$array_a_ordenar[0]['nombre']='Ester Colero';
$array_a_ordenar[0]['telefono']='94727834';
$array_a_ordenar[0]['edad']=20;
$array_a_ordenar[0]['vivo']=true;

$array_a_ordenar[1]['nombre']='Pancho Colate';
$array_a_ordenar[1]['telefono']='93524864';
$array_a_ordenar[1]['edad']=24;
$array_a_ordenar[0]['vivo']=false
los campos se deben corresponder a alguna columna, [en el ejemplo: 'nombre', 'telefono', 'edad' y/o 'vivo'].
Así pues este caso, habría 4 posibles columnas por las que ordenar.

asc_desc puede valer o bien: SORT_ASC o bien SORT_DESC ¡SIN COMILLAS! pues son valores constantes.

La función devolverá FALSE en caso de que los parámetros no sean correctos. En caso contrario, obtendremos el array de entrada ordenadito, por tantos campos le hayamos indicado.

Código PHP:
function ordenar_array() {
  
$n_parametros func_num_args(); // Obenemos el número de parámetros
  
if ($n_parametros<|| $n_parametros%2!=1) { // Si tenemos el número de parametro mal...
    
return false;
  } else { 
// Hasta aquí todo correcto...veamos si los parámetros tienen lo que debe ser...
    
$arg_list func_get_args();

    if (!(
is_array($arg_list[0]) && is_array(current($arg_list[0])))) {
      return 
false// Si el primero no es un array...MALO!
    
}
    for (
$i 1$i<$n_parametros$i++) { // Miramos que el resto de parámetros tb estén bien...
      
if ($i%2!=0) {// Parámetro impar...tiene que ser un campo del array...
        
if (!array_key_exists($arg_list[$i], current($arg_list[0]))) {
          return 
false;
        }
      } else { 
// Par, no falla...si no es SORT_ASC o SORT_DESC...a la calle!
        
if ($arg_list[$i]!=SORT_ASC && $arg_list[$i]!=SORT_DESC) {
          return 
false;
        }
      }
    }
    
$array_salida $arg_list[0];

    
// Una vez los parámetros se que están bien, procederé a ordenar...
    
$a_evaluar "foreach (\$array_salida as \$fila){\n";
    for (
$i=1$i<$n_parametros$i+=2) { // Ahora por cada columna...
      
$a_evaluar .= "  \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
    }
    
$a_evaluar .= "}\n";
    
$a_evaluar .= "array_multisort(\n";
    for (
$i=1$i<$n_parametros$i+=2) { // Ahora por cada elemento...
      
$a_evaluar .= "  \$campo{$i}, SORT_REGULAR, \$arg_list[".($i+1)."],\n";
    }
    
$a_evaluar .= "  \$array_salida);";
    
// La verdad es que es más complicado de lo que creía en principio... :)

    
eval($a_evaluar);
    return 
$array_salida;
  }
}

// EJEMPLO DE USO:

// Otra manera de declarar un array bidimensional de estos...
$array_a_ordenar = array(
                 
=> array('campo1' => 'patatas''campo2' => 1'campo3' => 'kkkk'),
                 
=> array('campo1' => 'coles''campo2' => 3'campo3' => 'aaaa'),
                 
=> array('campo1' => 'tomates''campo2' => 1'campo3' => 'zzzz'),
                 
=> array('campo1' => 'peras''campo2' => 7'campo3' => 'hhhh'),
                 
=> array('campo1' => 'tomates''campo2' => 4'campo3' => 'bbbb'),
                 
=> array('campo1' => 'aguacates''campo2' => 3'campo3' => 'yyyy'),
         );

$array_ordenadito ordenar_array($array_a_ordenar'campo2'SORT_DESC'campo1'SORT_DESC) or die('<br>ERROR!<br>');

$array_ordenadito2 ordenar_array($array_a_ordenar'campo3'SORT_DESC'campo2'SORT_DESC'campo1'SORT_ASC ) or die('<br>ERROR!<br>'); 
Un saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates