O PHP fornece uma gama de funções para que você possa ordenar arrays com base na chave ou valor de um array associativo. Porém, você pode ter um pouco de dificuldade de ordenar quando seus dados estão em um array de arrays associativos e, apartir daí, você precisa ordenar seu array de acordo com um ou mais atributos do mesmo.

O array

Os exemplos que se seguem têm por base os seguintes dados como uma matriz associativa. O array dados contém seis arrays, cada um dos quais tem um valor de “nome”, “sobrenome” e de “idade”.

<?php  
    $data = array(
        array( 'nome' => "Adler", 'sobrenome' => "Dias", 'idade' => 28 ),
        array( 'nome' => "Paulo", 'sobrenome' => "Ferraz", 'idade' => 24 ),
        array( 'nome' => "Andre", 'sobrenome' => "Rosset", 'idade' => 21 ),
        array( 'nome' => "Rafael", 'sobrenome' => "Quaresma", 'idade' => 22 ),
        array( 'nome' => "Rafael", 'sobrenome' => "Oliveira", 'idade' => 29 ),
        array( 'nome' => "Achiles", 'sobrenome' => "Bianchi", 'idade' => 30 )
   );
?>

Este conjunto de dados pode ser representado em formato de tabela como:

nome sobrenome idade
[0] Adler Dias 28
[1] Paulo Ferraz 24
[2] Andre Rosset 21
[3] Rafael Quaresma 22
[4] Rafael Oliveira 29
[5] Achiles Bianchi 30

Agora acredito que você já tenha conseguido visualizar esse array de array’s. Então, só nos resta começar a ordenar esse array de arrays.

Ordenar array com base em um único atributo

Ordenar arrays associativos com base em único campo é algo extremamente simples, desde, você saiba de antemão, qual o campo que você deseja ordenar.

Por exemplo, para ordenar por sobrenome você pode usar a seguinte função:

<?php  
    function compararSobrenome($a, $b)
    {
        return strnatcmp($a['sobrenome'], $b['sobrenome']);
    }
    // ordenar por sobrenome
     uasort($data, 'compararSobrenome');
?>

No código acima foi utilizada a função uasort para que fosse possível manter a associação do índice ao ordenar o array, casso não fosse necessário manter o índice, você pode utilizar a função usort.

A saída é a seguinte:

nome sobrenome idade
[5] Achiles Bianchi 30
[0] Adler Dias 28
[1] Paulo Ferraz 24
[4] Rafael Oliveira 29
[3] Rafael Quaresma 22
[2] Andre Rosset 21

A essa altura você deve ser capaz de modificar a função compararSobrenome para ordenar por nome (veja adiante), por idade, ou qualquer outro campo que você tenha a necessidade de ordenar em seu array associativo. A função strnatcmp é particularmente útil, uma vez que ela pode ser utilizada tanto aos números quanto com strings.

Ordenar array com base em múltiplos atributos

Se você quiser ordenar por nome e sobrenome, então, você pode pensar que apenas aplicando dois tipos em seqüência lhe daria o resultado desejado, como no exemplo abaixo:

<?php  
        // utilize o mesmo array do exemplo de cima.
        function CompararNome($a, $b)
    {
        return strnatcmp($a['nome'], $b['nome']);
    }
    // ordenar por nome
    function compararSobrenome($a, $b)
    {
        return strnatcmp($a['sobrenome'], $b['sobrenome']);
    }
    // ordenar por sobrenome
    uasort($data, 'CompararNome');
    uasort($data, 'compararSobrenome');
?>

Isso significa que, depois de ordenar pelo nome, em seguida, o resultado da ordenação, pelo sobrenome não necessariamente mantêm a ordem correta dos nomes.

Então, não é possível ordenar por duas colunas? Apenas precisaremos de uma nova função:

<?php  
    function comparaNomeSobrenome($a, $b)
    {
        $retval = strnatcmp($a['sobrenome'], $b['sobrenome']);
        if(!$retval)
            return strnatcmp($a['nome'], $b['nome']);
        return $retval;
    }
    // sort alphabetically by firstname and lastname
    usort($data, 'comparaNomeSobrenome');
?>

Agora a nossa saída seria a seguinte:
A saída é a seguinte:

nome sobrenome idade
[5] Achiles Bianchi 30
[0] Adler Dias 28
[2] Andre Rosset 21
[1] Paulo Ferraz 24
[4] Rafael Oliveira 29
[3] Rafael Quaresma 22

Esta função funciona porque primeiro fazemos a comparação dos nomes, e, se e somente se, eles são idênticos vai comparar os sobrenomes, assim conseguimos ordenar arrays da maneira que desejamos, ou seja, primeiro nome e depois sobrenome.