Arreglos unidimensionales básicos
$array = array(3, 5, 2, 8);
Funciones de clasificación aplicables:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
La diferencia entre estos es simplemente si las asociaciones de valores clave se mantienen (el "a
" funciones), si ordena de bajo a alto o inverso (" r
"), si clasifica valores o claves (" k
") y cómo compara los valores (" nat
" vs. normal). Consulte http://php.net/manual/en/array.sorting.php para obtener una descripción general y enlaces a más detalles.
Conjuntos multidimensionales, incluidos conjuntos de objetos
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
Si desea ordenar $array
por la clave 'foo' de cada entrada, necesita un función de comparación personalizada . Las sort
funciones anteriores y relacionadas funcionan con valores simples que saben cómo comparar y ordenar. PHP no simplemente "sabe" qué hacer con un valor complejo como el array('foo' => 'bar', 'baz' => 42)
embargo; así que necesitas contarlo.
Para hacer eso, necesita crear una función de comparación . Esa función toma dos elementos y debe regresar0
si estos elementos se consideran iguales, un valor inferior a0
si el primer valor es menor y un valor mayor que 0
si el primer valor es mayor. Eso es todo lo que se necesita:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
A menudo, querrás usar un función anónima como devolución de llamada. Si desea utilizar un método o método estático, consulte el otras formas de especificar una devolución de llamada en PHP .
Luego usa una de estas funciones:
Una vez más, solo difieren en si mantienen asociaciones clave-valor y clasifican por valores o claves. Lea su documentación para más detalles.
Ejemplo de uso:
usort($array, 'cmp');
usort
tomará dos elementos de la matriz y llamará a su cmp
función con ellos. Entonces cmp()
se llamará con $a
as array('foo' => 'bar', 'baz' => 42)
y $b
como otro array('foo' => ..., 'baz' => ...)
. La función luego regresa a usort
cuál de los valores era mayor o si eran iguales. usort
repite este proceso pasando valores diferentes para $a
y $b
hasta que se ordena la matriz. La cmp
función se llamará muchas veces, al menos tantas veces como haya valores $array
, con diferentes combinaciones de valores para $a
y $b
cada vez.
Para acostumbrarse a esta idea, intente esto:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
Todo lo que hizo fue definir una forma personalizada de comparar dos elementos, eso es todo lo que necesita. Eso funciona con todo tipo de valores.
Por cierto, esto funciona en cualquier valor, los valores no tienen que ser matrices complejas. Si desea hacer una comparación personalizada, también puede hacerlo en una simple matriz de números.
sort
¡ordena por referencia y no devuelve nada útil!
Tenga en cuenta que la matriz se ordena en su lugar , no necesita asignar el valor de retorno a nada. $array = sort($array)
reemplazará la matriz con true
, no con una matriz ordenada. Solo sort($array);
funciona
Comparaciones numéricas personalizadas
Si desea ordenar por la baz
clave, que es numérica, todo lo que necesita hacer es:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
Gracias a The PoWEr of MATH esto devuelve un valor <0, 0 o> 0 dependiendo de si $a
es menor, igual o mayor que $b
.
Tenga en cuenta que esto no funcionará bien para los float
valores, ya que se reducirán a una int
y perderán precisión. Utilice explícita -1
, 0
y1
los valores de retorno en su lugar.
Objetos
Si tiene una matriz de objetos, funciona de la misma manera:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
Las funciones
Puede hacer cualquier cosa que necesite dentro de una función de comparación, incluidas las funciones de llamada:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
Instrumentos de cuerda
Un atajo para la primera versión de comparación de cadenas:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
hace exactamente lo que se espera de cmp
aquí, vuelve -1
, 0
o 1
.
Operador de nave espacial
PHP 7 introdujo el operador de nave espacial , que unifica y simplifica igual / menor / mayor que las comparaciones entre tipos:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
Ordenar por múltiples campos
Si desea ordenar principalmente por foo
, pero si foo
es igual para dos elementos, ordene por baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
Para aquellos familiares, esto es equivalente a una consulta SQL con ORDER BY foo, baz
.
También vea esta versión abreviada muy ordenada y cómo crear una función de comparación de este tipo dinámicamente para un número arbitrario de teclas .
Ordenar en un orden manual, estático
Si desea ordenar los elementos en un "orden manual" como "foo", "bar", "baz" :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
Por todo lo anterior, si está utilizando PHP 5.3 o superior (y realmente debería hacerlo), use funciones anónimas para un código más corto y para evitar tener otra función global flotando:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
Así de simple puede ser ordenar una compleja matriz multidimensional. Nuevamente, solo piense en términos de enseñar a PHP cómo saber cuál de los dos elementos es "mayor" ; deja que PHP haga la clasificación real.
También para todo lo anterior, para cambiar entre orden ascendente y descendente, simplemente cambie los argumentos $a
y $b
. P.ej:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
Ordenar una matriz basada en otra
Y luego está lo peculiar array_multisort
, que le permite ordenar una matriz basada en otra:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
El resultado esperado aquí sería:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
Use array_multisort
para llegar allí:
array_multisort($array1, $array2);
A partir de PHP 5.5.0, puede usar array_column
para extraer una columna de una matriz multidimensional y ordenar la matriz en esa columna:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
A partir de PHP 7.0.0, también puede extraer propiedades de una matriz de objetos.
Si tiene casos más comunes, no dude en editar esta respuesta.