W3docs

Array Multisort em PHP: Um Guia Completo

Aprenda como array_multisort() ordena arrays paralelos e múltiplas colunas ao mesmo tempo em PHP com exemplos práticos.

array_multisort() ordena um ou mais arrays de uma vez. Seu verdadeiro poder está na ordenação de arrays paralelos — vários arrays que representam colunas do mesmo conjunto de dados — de forma que, ao reordenar um, os outros se movem em sincronia para manter as linhas correspondentes alinhadas. Esta página aborda a sintaxe, ordenações por múltiplas colunas (critérios de desempate), a armadilha da reindexação de chaves e como ela difere de sort() e usort().

Sintaxe

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

Os argumentos são lidos em grupos: cada array pode ser seguido por uma constante opcional de ordem de classificação e uma constante opcional de flags de classificação. A função ordena no lugar (os arrays são passados por referência) e retorna true em caso de sucesso, false em caso de falha.

ConstanteEfeito
SORT_ASCOrdenar de forma ascendente (padrão)
SORT_DESCOrdenar de forma descendente
SORT_REGULARComparar itens normalmente (padrão)
SORT_NUMERICComparar itens como números
SORT_STRINGComparar itens como strings

Ordenando um único array

Na sua forma mais simples, comporta-se como sort() — ordena um array no lugar:

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

Saída:

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

Ordenando arrays paralelos (o principal caso de uso)

Suponha que você tenha dois arrays alinhados por índice — um de idades, outro de nomes — e queira ordenar por idade mantendo cada nome associado à sua idade. Passe ambos os arrays; o primeiro array determina a ordem e todos os outros são reorganizados da mesma forma:

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

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

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

Saída:

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

Observe o critério de desempate: ambos os elementos com 25 anos mantêm suas posições, mas como um segundo array ($names, SORT_ASC) foi fornecido, as linhas com idades iguais são ordenadas pelo nome — Jane antes de John.

Ordenando por múltiplos critérios

Para resolver empates, liste os arrays em ordem de prioridade: o primeiro array é a chave de ordenação primária, o próximo desempata o primeiro, e assim por diante. Cada array recebe seu próprio flag de ordem, então você pode misturar colunas ascendentes e 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);

Saída:

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
)

Os dois 86s e os dois 67s são mantidos juntos, e dentro de cada empate as edições ficam em ordem ascendente.

Ordenando um array de linhas por uma coluna

Conjuntos de dados reais frequentemente são um array de linhas associativas. Use array_column() para extrair as colunas pelas quais deseja ordenar, depois passe o array original por último para que ele seja reordenado de acordo:

$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);

Saída:

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

Armadilha: as chaves são reindexadas

array_multisort() reindexia chaves numéricas (elas se tornam 0, 1, 2, …), mas as chaves string são preservadas. Se você precisa manter as chaves inteiras originais, ordene uma cópia das chaves junto com os dados, ou use uma função que preserve chaves como asort().

Quando usar qual função de ordenação

  • Use array_multisort() quando tiver arrays paralelos ou precisar de uma ordenação por múltiplas colunas.
  • Use sort() / rsort() para um único array por valor quando as chaves não importam.
  • Use ksort() / asort() para ordenar por chave, ou por valor preservando as chaves.
  • Use usort() quando um array precisar de lógica de comparação personalizada (ex.: ordenar por comprimento de string ou por um valor derivado) que os flags não conseguem expressar.

Veja a visão geral de Ordenação de Arrays para uma comparação lado a lado de todas as funções de ordenação.

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

Prática

Prática
O que a função array_multisort() em PHP faz?
O que a função array_multisort() em PHP faz?
Was this page helpful?