usort
En esta página
usort
Ordena un array utilizando una función de comparación
Descripción#
usort(array $array, callable $callback): true
```php
Ordena `array` en su lugar según los valores utilizando una función de comparación definida por el usuario.
> [!NOTE]
> Si dos miembros se comparan como iguales, mantienen su orden original. Anterior a PHP 8.0.0, su orden relativo en el array ordenado no está definido.
> [!NOTE]
> Esta función asigna nuevas claves a los elementos en `array`. Eliminará todas las claves existentes que hayan podido ser asignadas, en lugar de reordenar las claves.
## Parámetros
`array`
El array de entrada.
`callback`
La función de comparación debe retornar un entero menor que, igual a, o mayor que 0 si el primer argumento es considerado, respectivamente, menor que, igual a, o mayor que el segundo.
```php
callback(mixed $a, mixed $b): int
[!CAUTION] Devolver valores no enteros (como
float) desde la función de comparación resultará en una conversión interna del valor de retorno de la retrollamada aint. Así, valores como0.99y0.1serán convertidos ambos al valor entero0, por lo que se compararán como iguales.
Valores devueltos#
Retorna siempre true.
Historial de cambios#
| Versión | Descripción |
|---|---|
| 8.2.0 | El tipo de retorno es ahora true, anteriormente era bool. |
| 8.0.0 | Si callback espera un parámetro a ser pasado por referencia, esta función emite ahora una E_WARNING. |
Ejemplos#
Ejemplo con usort
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
El ejemplo anterior mostrará:
0: 1
1: 2
2: 3
3: 5
4: 6
El operador combinado puede ser utilizado para simplificar la comparación interna.
<?php
function cmp($a, $b)
{
return $a <=> $b;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
[!NOTE] Evidentemente en este caso trivial,
sortsería más apropiado.
Ordenación con usort sobre un array multidimensional
<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");
foreach ($fruits as $key => $value) {
echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
El ejemplo anterior mostrará:
$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons
Al ordenar arrays multidimensionales, $a y $b contienen referencias al primer elemento del array.
Ordenación con usort sobre un objeto
<?php
class TestObj {
public string $name;
function __construct($name)
{
$this->name = $name;
}
/* Esta es una función de comparación estática */
static function cmp_obj($a, $b)
{
return strtolower($a->name) <=> strtolower($b->name);
}
}
$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");
usort($a, [TestObj::class, "cmp_obj"]);
foreach ($a as $item) {
echo $item->name . "\n";
}
?>
El ejemplo anterior mostrará:
b
c
d
Ejemplo con usort utilizando una closure para ordenar un array multidimensional
<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
usort($array, build_sorter('key_b'));
foreach ($array as $item) {
echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>
El ejemplo anterior mostrará:
y, a
x, b
z, c
Ejemplo de uso del operador combinado con usort.
El operador combinado permite una comparación directa de valores compuestos sobre múltiples ejes. En el ejemplo siguiente, $people se ordena por apellido, luego por nombre si el apellido coincide.
<?php
$people[0] = ['first' => 'Adam', 'last' => 'West'];
$people[1] = ['first' => 'Alec', 'last' => 'Baldwin'];
$people[2] = ['first' => 'Adam', 'last' => 'Baldwin'];
function sorter(array $a, array $b) {
return [$a['last'], $a['first']] <=> [$b['last'], $b['first']];
}
usort($people, 'sorter');
foreach ($people as $person) {
print $person['last'] . ', ' . $person['first'] . PHP_EOL;
}
?>
El ejemplo anterior mostrará:
Baldwin, Adam
Baldwin, Alec
West, Adam
Véase también#
uasort
uksort
Las funciones de
ordenación de arrays