Ordenación de Vectores

Para terminar con el tema de vectores o matrices en PHP vamos a ver unas de las funciones más interesantes ya que nos pueden facilitar mucho la tarea. Veremos las funciones de ordenación de vectores. Para eso veamos primero unos conceptos introductorios:

  • Ordenación ascendente, los elementos se ordenan de menor a mayor
  • Ordenación descendente, los elementos se re-ordenan de mayor a menor
  • Ordenación por valor, se ordena por el contenido
  • Ordenación por índice, se ordena según el índice del vector
  • Dentro de la ordenación podremos elegir entre conservar el índice o renovarlo
  • Las cadenas siempre se comparan convertidas a número, entre otras cosas esto provoca que se distinga entre mayúsculas y minúsculas y que podamos comparar números con cadenas
  • Las cadenas se comparan carácter a carácter
  • Para alterar estos resultados, disponemos de:
    • SORT_NUMERIC, compara cadenas como números
    • SORT_STRING, compara cadenas como como cadenas (alfabéticamente, ordenación natural)

Sort impredecible para tipos de datos mixtos

Probando los ejercicios que vienen a continuación, nos ha pasado que a la hora de comparar arrays con valores mixtos, tanto del tipo [“uno”,2] como del tipo [“libro4″,”libro10″,libro”11”], los resultados eran aparentemente dependientes de los ínidces, lo cual es imposible ya que sort no sólo no tiene en cuenta los índices sino que también los modifica.
Consultado la documentación online en php.net hemos encontrado este aviso.

Problemas con sort y arrays mixtos

Por tanto algunos de los ejercicios que se muestra a continuación son meramentes teóricos y no debemos dar demasiada importancia a los resultados.

Ordenación por contenido SORT

la función SORT ordena siempre de forma ascendente y además altera el vector original. Necesita como mínimo un parámetro que será el vector a ordenar y puede aceptar como segundo parámetro:

  • SORT_REGULAR, por defecto
  • SORT_NUMERIC
  • SORT_STRING

Ejemplo de uso

<?php
function mostrar($matriz)
    {
    foreach ($matriz as $contenido)
        echo "<p>Valor: <b> ".$contenido."</p>";
    echo "<p>___________________________________________________</p>";
    }
 
$matriz_numeros=array(0,1,2,5,6,3,4,7,8,9);
$matriz_alfabetica=array("aaa","abc","aad","aza","aaz","abb");
$matriz_mixta=array("55","6",7,"61",9);

echo "<h2>Vamos a probar las ordenaciones con numeros</h2>";
sort($matriz_numeros);
mostrar($matriz_numeros);
sort($matriz_numeros,SORT_NUMERIC);
mostrar($matriz_numeros);
sort($matriz_numeros,SORT_STRING);
mostrar($matriz_numeros);
echo "<h2>Vamos a probar las ordenaciones con cadenas, la primera es la original</h2>";
mostrar($matriz_alfabetica);
sort($matriz_alfabetica);
mostrar($matriz_alfabetica);
sort($matriz_alfabetica,SORT_NUMERIC);
mostrar($matriz_alfabetica);
sort($matriz_alfabetica,SORT_STRING);
mostrar($matriz_alfabetica);
echo "<h2>Vamos a probar las ordenaciones con cadenas y numeros, la primera es la original</h2>";
mostrar($matriz_mixta);
sort($matriz_mixta);
mostrar($matriz_mixta);
sort($matriz_mixta,SORT_NUMERIC);
mostrar($matriz_mixta);
sort($matriz_mixta,SORT_STRING);
mostrar($matriz_mixta);
?>

Ejercicios

Usaremos una regla muy sencilla para ordenar. Si son números no ponemos nada, si son letras obligaremos a string, y si es una matriz mixta deberemos decantarnos por uno o otro método que normalmente será no poner nada.

  1. Haz lo mismo para este vector $vector=array(“libro9″,”libro10″,”libro11”), ¿Còmo queda mejor?
  2. Haz una función que ordene $vector_numérico de forma descendente (tendrás que usar array reverse)
  3. Haz una función que ordene y elimine los valores repetidos
  4. Usando las dos anteriores haz una función de ordene de forma descendente sin repetidos
  5. Ordena la agenda de teléfonos que usamos en la práctica: Agenda en vector unidimensional con PHP
  6. Dada esta matriz de dos dimensiones, haz una función que ordene cada uno de los vectores que la componen: $matriz=array(array(1,2,”3″,4,9,6,7),array(“a”,”ba”,”zzz”,”zzd”),array(34,”2″,34,56,7,89));.
  7. Modifica la función anterior para que haga lo mismo pero de forma descendente
  8. Para el próximo tema nos va a venir muy bien recordar los formularios, así que haz lo siguiente:
    • Crea un formulario desde el que se pediran 10 valores (formulario.html)
    • Ese formulario deberá ser procesado por la función procesar.php
    • El procesamiento consistirá en:
      • Ordenar los valores de forma numérica
      • Ordenar los valores de forma alfanumérica
      • Ordenar y quitar los duplicados
      • Ordenar, quitar los duplicados y mostrar al revés
      • Deberás usar las funciones que hemos creado en los ejercicios anteriores las operaciones se harán una tras otra

Otras funciones para ordenar

Tenemos más funciones para ordenar vectores, son:

  • rsort, igual que sort pero ordena de forma descendente
  • asort, igual que sort pero respeta los ínidices
  • arsort, igual que asort pero respeta de forma descendente
<?php
function mostrar($matriz)
    {
    foreach ($matriz as $contenido)
        echo "<p>Valor: <b> ".$contenido."</p>";
    echo "<p>___________________________________________________</p>";
    }
 
$matriz_numeros=array(0,1,2,5,6,3,4,7,8,9);
$matriz_alfabetica=array("aaa","abc","aad","aza","aaz","abb");
$matriz_mixta=array("55","6",7,"61",9);

echo "<h2>Vamos a probar las ordenaciones con numeros</h2>";
rsort($matriz_numeros);
mostrar($matriz_numeros);
rsort($matriz_numeros,SORT_NUMERIC);
mostrar($matriz_numeros);
rsort($matriz_numeros,SORT_STRING);
mostrar($matriz_numeros);
echo "<h2>Vamos a probar las ordenaciones con cadenas, la primera es la original</h2>";
mostrar($matriz_alfabetica);
rsort($matriz_alfabetica);
mostrar($matriz_alfabetica);
rsort($matriz_alfabetica,SORT_NUMERIC);
mostrar($matriz_alfabetica);
rsort($matriz_alfabetica,SORT_STRING);
mostrar($matriz_alfabetica);
echo "<h2>Vamos a probar las ordenaciones con cadenas y numeros, la primera es la original</h2>";
mostrar($matriz_mixta);
rsort($matriz_mixta);
mostrar($matriz_mixta);
rsort($matriz_mixta,SORT_NUMERIC);
mostrar($matriz_mixta);
rsort($matriz_mixta,SORT_STRING);
mostrar($matriz_mixta);
?>

Ordenaciones naturales

Si bien la ordenación natural es muy parecida a la ordenación regular, dispondemos de un par de funciones que realizar una ordenación explicitamente natural, son natsort() y natcasesort(). La diferencia entre ambas radica en la distinción de mayúsculas y minúsculas (la segunda no distingue en teoría). Por otro lado ambas hacen el orden ascendente. Veamos un ejemplo

<?php
function mostrar($matriz)
    {
    foreach ($matriz as $contenido)
        echo "<p>Valor: <b> ".$contenido."</p>";
    echo "<p>___________________________________________________</p>";
    }
$matriz=array("libro9","LIBRO9","libro81");
natsort($matriz);
mostrar($matriz);
natcasesort($matriz);
mostrar($matriz);
?>

Ordenación de vectores por sus índices

Para terminar vamos a ver como podemos ordenar los vectores por sus índices. Para ello usaremos: ksort(). krsort(). Son identicas a sort y rsort respectivamente, pero hacen la ordenación por índice. Admiten el parámetro para ordenar numérico o carácter.

Originally posted 2011-02-23 20:04:12.

Deja un comentario