W3docs

Array Multisort en PHP: Una Guía Completa

Aprende cómo array_multisort() ordena arrays paralelos y múltiples columnas a la vez en PHP con ejemplos prácticos.

array_multisort() ordena uno o más arrays a la vez. Su verdadero poder radica en ordenar arrays paralelos — varios arrays que representan columnas del mismo conjunto de datos — de modo que al reordenar uno, los demás se mueven al mismo tiempo para mantener las filas correspondientes alineadas. Esta página cubre la sintaxis, los ordenamientos por múltiples columnas (para desempatar), el problema de la reindexación de claves y cómo se diferencia de sort() y usort().

Sintaxis

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags  = SORT_REGULAR,
    mixed ...$rest
): bool

Los argumentos se leen en grupos: cada array puede ir seguido de una constante de orden de clasificación opcional y una constante de indicadores de clasificación opcional. La función ordena en el lugar (los arrays se pasan por referencia) y devuelve true en caso de éxito, false en caso de fallo.

ConstanteEfecto
SORT_ASCOrdenar en sentido ascendente (predeterminado)
SORT_DESCOrdenar en sentido descendente
SORT_REGULARComparar elementos normalmente (predeterminado)
SORT_NUMERICComparar elementos como números
SORT_STRINGComparar elementos como cadenas de texto

Ordenar un solo array

En su forma más simple se comporta como sort() — ordena un array en el lugar:

$data = [3, 1, 2];
array_multisort($data);
print_r($data);

Salida:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Ordenar arrays paralelos (el caso de uso principal)

Supongamos que tienes dos arrays alineados por índice — uno de edades y otro de nombres — y quieres ordenar por edad manteniendo cada nombre asociado a su edad. Pasa ambos arrays; el primero determina el orden y todos los demás se reordenan de la misma manera:

$ages  = [25, 25, 30];
$names = ['John', 'Jane', 'Alice'];

array_multisort($ages, SORT_ASC, $names, SORT_ASC);

print_r($ages);
print_r($names);

Salida:

Array
(
    [0] => 25
    [1] => 25
    [2] => 30
)
Array
(
    [0] => Jane
    [1] => John
    [2] => Alice
)

Observa el desempate: ambos con 25 años conservan sus posiciones, pero como se proporcionó un segundo array ($names, SORT_ASC), las filas con edades iguales se ordenan por nombre — Jane antes que John.

Ordenar por múltiples criterios

Para desempatar, lista los arrays en orden de prioridad: el primero es la clave de ordenamiento principal, el siguiente desempata en caso de igualdad en el primero, y así sucesivamente. Cada array tiene su propio indicador de orden, por lo que puedes combinar columnas ascendentes y descendentes:

$volume  = [67, 86, 85, 98, 86, 67];
$edition = [2, 1, 6, 2, 6, 7];

// Sort by volume DESC, then by edition ASC for equal volumes.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC);

print_r($volume);
print_r($edition);

Salida:

Array
(
    [0] => 98
    [1] => 86
    [2] => 86
    [3] => 85
    [4] => 67
    [5] => 67
)
Array
(
    [0] => 2
    [1] => 1
    [2] => 6
    [3] => 6
    [4] => 2
    [5] => 7
)

Los dos 86 y los dos 67 se mantienen juntos, y dentro de cada empate las ediciones están en orden ascendente.

Ordenar un array de filas por una columna

Los conjuntos de datos reales suelen ser un array de filas asociativas. Usa array_column() para extraer las columnas por las que quieres ordenar y luego pasa el array original al final para que se reordene en consecuencia:

$rows = [
    ['name' => 'Bob',   'age' => 30],
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Carol', 'age' => 30],
];

$age  = array_column($rows, 'age');
$name = array_column($rows, 'name');

// Primary: age ASC. Tie-break: name ASC.
array_multisort($age, SORT_ASC, $name, SORT_ASC, $rows);

print_r($rows);

Salida:

Array
(
    [0] => Array ( [name] => Alice [age] => 25 )
    [1] => Array ( [name] => Bob   [age] => 30 )
    [2] => Array ( [name] => Carol [age] => 30 )
)

Problema: las claves se reindexan

array_multisort() reindexia las claves numéricas (se convierten en 0, 1, 2, …), pero las claves de tipo string se conservan. Si necesitas mantener las claves enteras originales, ordena una copia de las claves junto con los datos, o usa una función que preserve las claves como asort().

Cuándo usar cada función de ordenamiento

  • Usa array_multisort() cuando tengas arrays paralelos o necesites un ordenamiento por múltiples columnas.
  • Usa sort() / rsort() para un solo array por valor cuando las claves no importan.
  • Usa ksort() / asort() para ordenar por clave, o por valor preservando las claves.
  • Usa usort() cuando un array necesita lógica de comparación personalizada (por ejemplo, ordenar por longitud de cadena o por un valor derivado) que los indicadores no pueden expresar.

Consulta el resumen de Ordenamiento de Arrays para ver una comparación lado a lado de todas las funciones de ordenamiento.

graph LR
A[Array] --> B[Array Multisort]
B --> C[Ascending/Descending Order]
B --> D[Sorting by Key]
B --> E[Sorting by Multiple Criteria]

Práctica

Práctica
¿Qué hace la función array_multisort() en PHP?
¿Qué hace la función array_multisort() en PHP?
Was this page helpful?