Spanish (Español) translation by Rene Soto (you can also view the original English article)
Siempre es más fácil obtener una información específica de los datos ordenados, de lo contrario, tendrá que revisar cada elemento del arreglo de uno en uno.Por ejemplo, digamos que ha almacenado el puntaje de diferentes estudiantes en una clase en un arreglo o en una tabla. Si los datos no están ordenados por los puntajes obtenidos, tendrá que mirar el puntaje de cada estudiante en la clase antes de poder saber quién obtuvo el puntaje más alto y más bajo. Si la tabla ya estaba ordenada de baja a alta en base a los puntajes, solo con mirar el puntaje del primer estudiante le diría la calificación más baja.
La clasificación hace que muchas tareas que requieren acceder u obtener un conjunto específico de datos sean muy fáciles y eficientes. En este tutorial, aprenderemos cómo usar las funciones incorporadas de PHP para ordenar diferentes tipos de arreglos.
Ordenar un Arreglo por Valor
Ordenar un arreglo por el valor de sus elementos es muy fácil en PHP. Puede elegir mantener o descartar las asociaciones clave-valor, y también puede definir sus propias funciones para dictar cómo se ordenan los elementos. Te mostraré cómo en esta sección del tutorial.
Puede
usar la función sort(&$array, $sort_flags)
para ordenar los valores de
una arreglo de bajo a alto. Sin embargo, no mantendrá ninguna asociación
clave-valor al ordenar la arreglo. Las nuevas claves se asignan a los elementos ordenados en
lugar de una simple reordenación. El segundo parámetro opcional le permite especificar
cómo deben ordenarse los elementos. Puede tener seis valores diferentes:
-
SORT_REGULAR
: esto ordenará los valores sin cambiar sus tipos. -
SORT_NUMERIC
: esto ordenará los valores comparándolos numéricamente. - SORT_STRING: esto ordenará los valores comparándolos como cadenas.
-
SORT_LOCALE_STRING
: esto comparará los valores como cadenas basadas en la configuración regional actual. Puede actualizar la configuración regional usted mismo utilizandosetlocale ()
. -
SORT_NATURAL
: esto ordenará los elementos utilizando el "orden natural" al compararlos como cadenas. -
SORT_FLAG_CASE
: se puede combinar conSORT_STRING
oSORT_NATURAL
para desactivar la distinción entre mayúsculas y minúsculas mientras se clasifican las cadenas.
Aquí hay un par de ejemplos de clasificación para ayudarlo a comprender rápidamente la diferencia entre todas las banderas de clasificación.
1 |
<?php
|
2 |
|
3 |
$random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"]; |
4 |
|
5 |
sort($random_data); |
6 |
echo "Regular Sorting — "; |
7 |
foreach($random_data as $element) { |
8 |
echo str_pad($element, 9)." "; |
9 |
}
|
10 |
// Regular Sorting — 38 123 32508 98134 234984 3249832 Apple
|
11 |
|
12 |
sort($random_data, SORT_NUMERIC); |
13 |
echo "\nNumeric Sorting — "; |
14 |
foreach($random_data as $element) { |
15 |
echo str_pad($element, 9)." "; |
16 |
}
|
17 |
// Numeric Sorting — Apple 38 123 32508 98134 234984 3249832
|
18 |
|
19 |
sort($random_data, SORT_STRING); |
20 |
echo "\nString Sorting — "; |
21 |
foreach($random_data as $element) { |
22 |
echo str_pad($element, 9)." "; |
23 |
}
|
24 |
// String Sorting — 123 234984 3249832 32508 38 98134 Apple
|
En el primer ejemplo, la clasificación regular, las cadenas numéricas se convierten a sus valores numéricos, y la clasificación se realiza en consecuencia. La cadena "Apple" no es numérica, por lo que se deja intacta y se compara como una cadena.
En el segundo ejemplo, la ordenación numérica, queremos que los datos se ordenen según el valor numérico, por lo que "Apple" se convierte al valor numérico 0 y aparece primero. El resto de los valores se ordenan como se espera.
En el tercer ejemplo, todos los valores se tratan como cadenas. Esto significa que en lugar de comparar el valor numérico de 123 o 3249832 con 38, se comparan como cadenas, un carácter a la vez. Como "1" aparece antes de "3", el valor 123 se considera menor que 38.
Si
desea ordenar los valores de arreglo de alto a bajo en lugar de bajo a alto,
puede hacerlo con la ayuda de la función rsort ()
. Acepta todos los mismos parámetros que sort ()
pero ordena
los valores en orden inverso. Tampoco mantiene ninguna asociación clave-valor,
por lo que no es una buena opción para clasificar matrices asociativas.
Ordenar un Arreglo Asociativo
Las asociaciones de valores clave se vuelven importantes
cuando se trata de arreglos asociativos.
Considere el siguiente ejemplo, donde se usa una
arreglo asociativo para almacenar los nombres de diferentes personas y su fruta
favorita. Si desea ordenar la lista alfabéticamente por los nombres de
la fruta, el uso de la función sort ()
de la sección anterior resultará en la
pérdida de las claves asociadas.
1 |
<?php
|
2 |
|
3 |
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; |
4 |
|
5 |
echo "Before Sorting — \n"; |
6 |
foreach($fruit_preferences as $person=>$preference) { |
7 |
echo $person." likes ".$preference."\n"; |
8 |
}
|
9 |
|
10 |
/*
|
11 |
Before Sorting —
|
12 |
James likes Orange
|
13 |
John likes Banana
|
14 |
Patricia likes Apple
|
15 |
Jennifer likes Mango
|
16 |
Mary likes Grapes
|
17 |
*/
|
18 |
|
19 |
sort($fruit_preferences); |
20 |
|
21 |
echo "After Sorting — \n"; |
22 |
foreach($fruit_preferences as $person=>$preference) { |
23 |
echo $person." likes ".$preference."\n"; |
24 |
}
|
25 |
|
26 |
/*
|
27 |
After Sorting —
|
28 |
0 likes Apple
|
29 |
1 likes Banana
|
30 |
2 likes Grapes
|
31 |
3 likes Mango
|
32 |
4 likes Orange
|
33 |
*/
|
34 |
|
35 |
?>
|
Como puede ver, no solo perdimos la asociación de las personas con su fruta favorita, sino que también perdimos los nombres de las diferentes personas. A cada valor ordenado se le ha asignado un nuevo índice numérico basado en su posición en el arreglo ordenada.
Para
ayudarlo a abordar este problema fácilmente, PHP tiene dos funciones diferentes
que mantienen la asociación clave-valor mientras clasifican los arreglos por sus
valores. Estas dos funciones son asort()
y arsort()
. El siguiente
fragmento de código ordena la misma arreglo $fruit_preferences
pero usa asort()
para hacerlo.
1 |
<?php
|
2 |
|
3 |
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; |
4 |
|
5 |
echo "Before Sorting — \n"; |
6 |
foreach($fruit_preferences as $person=>$preference) { |
7 |
echo $person." likes ".$preference."\n"; |
8 |
}
|
9 |
|
10 |
/*
|
11 |
Before Sorting —
|
12 |
James likes Orange
|
13 |
John likes Banana
|
14 |
Patricia likes Apple
|
15 |
Jennifer likes Mango
|
16 |
Mary likes Grapes
|
17 |
*/
|
18 |
|
19 |
asort($fruit_preferences); |
20 |
|
21 |
echo "After Sorting — \n"; |
22 |
foreach($fruit_preferences as $person=>$preference) { |
23 |
echo $person." likes ".$preference."\n"; |
24 |
}
|
25 |
|
26 |
/*
|
27 |
After Sorting —
|
28 |
Patricia likes Apple
|
29 |
John likes Banana
|
30 |
Mary likes Grapes
|
31 |
Jennifer likes Mango
|
32 |
James likes Orange
|
33 |
*/
|
34 |
|
35 |
?>
|
Como es evidente por el ejemplo anterior, el valor de Apple
se mueve a la parte superior mientras mantiene su asociación con Patricia. Los
nombres de las frutas se podrían ordenar al revés con la misma facilidad
mediante la función arsort()
.
Ambas funciones aceptan los mismos indicadores de
clasificación que el valor de su segundo parámetro opcional como sort()
y rsort()
.
Ordenar Elementos de Arreglo por Valor con Funciones Definidas por el Usuario
Las cuatro funciones de clasificación pueden manejar fácilmente sus necesidades comunes de clasificación con la ayuda de diferentes indicadores. Sin embargo, a veces sus criterios para comparar los elementos del arreglo pueden ser diferentes.
Digamos que tiene una serie de palabras aleatorias que deben ordenarse alfabéticamente. Sin embargo, también desea clasificarlos en función de su longitud antes de clasificarlos alfabéticamente. Por ejemplo, la palabra zoo vendría después de apple en la clasificación alfabética tradicional. Sin embargo, si desea mostrar las palabras cortas antes de las más largas, el zoo aparecerá antes que apple. En el mismo conjunto de letras, la palabra ape vendría antes de zoo debido al orden alfabético.
Básicamente, las palabras se ordenan primero según su longitud, y luego las palabras con el mismo número de letras se ordenan alfabéticamente dentro de su propio grupo. Este tipo de clasificación no está integrado en PHP, por lo que tendremos que escribir nuestra propia función de clasificación.
Lo que hace PHP en este caso es proporcionarle un par de funciones que se pueden usar para pasar la arreglo que desea ordenar, junto con el nombre de su propia función de clasificación.
Puede usar la función usort()
para ordenar valores de arreglo
en arreglos regulares. De manera similar, puede usar la función uasort()
para
ordenar los valores en arreglos asociativas y al mismo tiempo mantener las
asociaciones clave-valor.
El fragmento de código a continuación muestra una forma de
lograr este comportamiento.
1 |
<?php
|
2 |
|
3 |
$random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"]; |
4 |
|
5 |
sort($random_words); |
6 |
echo "Regular Sort Function: \n"; |
7 |
foreach($random_words as $element) { |
8 |
echo str_pad($element, 9)." "; |
9 |
}
|
10 |
|
11 |
/*
|
12 |
Regular Sort Function:
|
13 |
ape apple banana elephant eye picnic pie zoo
|
14 |
*/
|
15 |
|
16 |
function custom_sort($word_a, $word_b) { |
17 |
if (strlen($word_a) < strlen($word_b)) { |
18 |
return -1; |
19 |
}
|
20 |
if (strlen($word_a) == strlen($word_b)) { |
21 |
return strcmp($word_a, $word_b); |
22 |
}
|
23 |
if (strlen($word_a) > strlen($word_b)) { |
24 |
return 1; |
25 |
}
|
26 |
}
|
27 |
|
28 |
usort($random_words, "custom_sort"); |
29 |
echo "\nCustom Sort Function: \n"; |
30 |
foreach($random_words as $element) { |
31 |
echo str_pad($element, 9)." "; |
32 |
}
|
33 |
|
34 |
/*
|
35 |
Custom Sort Function:
|
36 |
ape eye pie zoo apple banana picnic elephant
|
37 |
*/
|
38 |
|
39 |
?>
|
En las funciones de devolución de llamada destinadas a la
clasificación personalizada, tenemos que devolver un número entero menor que 0
para indicar que el primer valor es más pequeño que el segundo. Devuelve 0 si
el primer valor es igual al segundo. Devuelve un entero mayor que 0 si el
primer valor es mayor que el segundo.
Como nuestro criterio de clasificación principal era la longitud
de la cadena, devolvemos directamente -1 si la primera palabra es más corta que
la segunda. De manera similar, devolvemos directamente 1 si la primera palabra es más larga que la segunda. Si las dos palabras tienen la misma longitud, las comparamos alfabéticamente utilizando la función strcmp()
y devolvemos su valor.
Como puede ver en la salida, nuestra función de ordenación personalizada reordena las palabras exactamente de la manera que queríamos.
Ordenar un Arreglo por Clave
La clasificación de un arreglo en función de sus claves es
generalmente útil cuando se trata de arreglos asociativos.Por
ejemplo, puede tener un arreglo con información sobre el número total de
aeropuertos en varios países. Suponiendo
que los nombres de los diferentes países sean claves y que los números de los
aeropuertos sean valores, es posible que desee ordenar los nombres de los
países alfabéticamente. Esto es muy fácil de hacer con las funciones ksort()
y
krsort()
. Ambas funciones mantendrán la asociación clave-valor de los
elementos del arreglo después de la clasificación. La función ksort()
ordena
las teclas de bajo a alto, y krsort()
ordena las teclas de alto a bajo.
Aquí hay un ejemplo básico de clasificación:
1 |
<?php
|
2 |
|
3 |
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; |
4 |
|
5 |
ksort($airport_count); |
6 |
|
7 |
foreach($airport_count as $country=>$count) { |
8 |
echo str_pad($country, 15)." ".$count."\n"; |
9 |
}
|
10 |
|
11 |
/*
|
12 |
Argentina 1138
|
13 |
Bolivia 855
|
14 |
Brazil 4093
|
15 |
Canada 1467
|
16 |
Colombia 836
|
17 |
Indonesia 673
|
18 |
Mexico 1714
|
19 |
Paraguay 799
|
20 |
Russia 1218
|
21 |
United States 13513
|
22 |
*/
|
23 |
|
24 |
?>
|
También puede proporcionar a PHP su propia función
personalizada para ordenar las claves de arreglo utilizando la función uksort()
.
Al igual que usort()
, la función de devolución de llamada en uksort()
también
requiere que devuelva un entero menor que 0 si la primera clave se considera
menor que la segunda y un entero mayor que 0 si la primera clave es mayor que
la segunda. Esta función también mantiene la asociación clave-valor de los elementos del arreglo.
1 |
<?php
|
2 |
|
3 |
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; |
4 |
|
5 |
function custom_sort($word_a, $word_b) { |
6 |
if (strlen($word_a) < strlen($word_b)) { |
7 |
return -1; |
8 |
}
|
9 |
if (strlen($word_a) == strlen($word_b)) { |
10 |
return strcmp($word_a, $word_b); |
11 |
}
|
12 |
if (strlen($word_a) > strlen($word_b)) { |
13 |
return 1; |
14 |
}
|
15 |
}
|
16 |
|
17 |
uksort($airport_count, "custom_sort"); |
18 |
|
19 |
foreach($airport_count as $country=>$count) { |
20 |
echo str_pad($country, 15)." ".$count."\n"; |
21 |
}
|
22 |
|
23 |
/*
|
24 |
Brazil 4093
|
25 |
Canada 1467
|
26 |
Mexico 1714
|
27 |
Russia 1218
|
28 |
Bolivia 855
|
29 |
Colombia 836
|
30 |
Paraguay 799
|
31 |
Argentina 1138
|
32 |
Indonesia 673
|
33 |
United States 13513
|
34 |
*/
|
35 |
|
36 |
?>
|
En el ejemplo anterior, hemos utilizado la función de ordenación personalizada de la sección anterior para ordenar los nombres de los países primero por la longitud de su nombre y luego alfabéticamente.
Clasificación de Arreglos Multidimensionales en PHP
Es mucho más común en la vida real tratar con información multidimensional. Por ejemplo, las instituciones almacenarán las marcas de todos los estudiantes en una variedad de temas en una sola tabla en lugar de crear nuevas tablas para cada tema. Si tiene que almacenar la misma información en PHP, también preferiría hacerlo utilizando un arreglo multidimensional en lugar de un arreglo separada para cada tema
En este tutorial, aprenderemos cómo ordenar un arreglo multidimensional utilizando una lista de los edificios más altos del mundo como ejemplo. Nuestro arreglo contendrá información sobre el nombre del edificio, la ciudad y el país donde se ubica, el número de pisos y la altura total en metros, junto con el año en que se construyó.
Cuando quiera ordenar los valores en una arreglo
multidimensional basada en un campo particular, simplemente puede usar la
función usort()
. El siguiente ejemplo debería ayudarte a entender mejor esta
técnica.
1 |
<?php
|
2 |
|
3 |
$tallest_buildings = [ |
4 |
["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010], |
5 |
["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015], |
6 |
["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012], |
7 |
["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017], |
8 |
["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016] |
9 |
];
|
10 |
|
11 |
function storey_sort($building_a, $building_b) { |
12 |
return $building_a["Floors"] - $building_b["Floors"]; |
13 |
}
|
14 |
|
15 |
usort($tallest_buildings, "storey_sort"); |
16 |
|
17 |
foreach($tallest_buildings as $tall_building) { |
18 |
list($building, $city, $country, $height, $floors) = array_values($tall_building); |
19 |
echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n"; |
20 |
}
|
21 |
|
22 |
/*
|
23 |
Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors.
|
24 |
Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.
|
25 |
Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.
|
26 |
Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors.
|
27 |
Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.
|
28 |
*/
|
29 |
|
30 |
?>
|
En el ejemplo anterior, la información sobre cada edificio
se almacena en su propio arreglo dentro del arreglo principal $tallest_buildings
.
La función storey_sort()
simplemente resta el número de pisos en el segundo
edificio del primero para determinar qué edificio es más pequeño según nuestros
criterios. No tenemos que preocuparnos por devolver un valor negativo o positivo específico porque todos los valores negativos significan más pequeños y todos los valores positivos significan más grandes.
Al final, simplemente iteramos a través del arreglo principal e imprimimos información sobre cada edificio.
Conclusiones Finales
En este tutorial, le mostré algunas funciones diferentes en
PHP que se pueden usar para ordenar los arreglos por sus claves o sus valores.
También aprendimos cómo ordenar una arreglo por sus claves o valores utilizando
nuestros propios criterios de clasificación personalizados con la ayuda de las
funciones uksort()
y uasort()
. La sección final discutió cómo ordenar todos los valores en un
arreglo multidimensional usando solo un campo específico.
Espero que haya aprendido algo nuevo de este tutorial. Si
tiene alguna pregunta o sugerencia, hágamelo saber en los comentarios. La mejor
manera de aprender es probar y crear algunos ejemplos propios, clasificando arreglos
utilizando estas funciones.