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 $arraypor la clave 'foo' de cada entrada, necesita un función de comparación personalizada . Las sortfunciones 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 0si 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');
usorttomará dos elementos de la matriz y llamará a su cmpfunción con ellos. Entonces cmp()se llamará con $aas array('foo' => 'bar', 'baz' => 42)y $bcomo otro array('foo' => ..., 'baz' => ...). La función luego regresa a usortcuál de los valores era mayor o si eran iguales. usortrepite este proceso pasando valores diferentes para $ay $bhasta que se ordena la matriz. La cmpfunción se llamará muchas veces, al menos tantas veces como haya valores $array, con diferentes combinaciones de valores para $ay $bcada 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 bazclave, 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 $aes menor, igual o mayor que $b.
Tenga en cuenta que esto no funcionará bien para los floatvalores, ya que se reducirán a una inty perderán precisión. Utilice explícita -1, 0y1 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']);
}
strcmphace exactamente lo que se espera de cmpaquí, vuelve -1, 0o 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 fooes 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 $ay $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_multisortpara llegar allí:
array_multisort($array1, $array2);
A partir de PHP 5.5.0, puede usar array_columnpara 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.