Manual do PHP
Anterior |  | Próxima

# array_multisort

(PHP 4, PHP 5)

array_multisort -- Ordena múltiplos arrays ou arrays multi-dimensionais

## Descrição

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )

Retorna `TRUE` em caso de sucesso ou `FALSE` em falhas.

array_multisort() pode ser usada para ordenar vários arrays de uma vez, ou um array multi dimensional por uma ou mais dimensões.

Chaves associativas (string) serão mantidas, mas chaves númerica serão reindexadas.

Os arrays dados são tratados como colunas de uma tabela a ser classificada pelas linhas - isso lembra a funcionalidade da cláusula ORDER BY da SQL. O primeiro array é o principal na ordenação. As linhas (valores) no primeiro array serve de base para a ordenação do próximo, e assim por diante.

A estrutura de argumentos dessa função não é muito normal, mas bastante flexível. O primeiro argumento de todos deve ser um array. Subsequentemente, cada argumento pode ser um array ou um dos sinais de classificação da lista a seguir.

Sinais de ordem de classificação:

- `SORT_ASC` - classifica na ordem crescente

- `SORT_DESC` - classifica na ordem descrescente

Sinais de tipos de ordenação:

- `SORT_REGULAR` - compara os elementos normalmente

- `SORT_NUMERIC` - compara os elementos como itens numéricos

- `SORT_STRING` - compara os elementos como strings

Não podem existir dois sinais de ordenação do mesmo tipo especificados para um mesmo array. Os sinais de ordenação especificados depois de um array se aplicam apenas para esse array - a eles são atribuídos por padrão os valores `SORT_ASC` e `SORT_REGULAR` antes de cada novo argumento do tipo array.

Retorna `TRUE` em caso de sucesso ou `FALSE` em falhas.

Exemplo 1. Ordenando múltiplos arrays

`<?php $ar1 = array("10", 100, 100, "a"); $ar2 = array(1, 3, "2", 1); array_multisort($ar1, $ar2); var_dump($ar1); var_dump($ar2); ?>`

Nesse exemplo, depois da ordenação, o primeiro array terá "10", "a", 100, 100. O segundo conterá 1, 1, "2", 3. Os elementos do segundo array que correpondem aos do primeiro (100 e 100) também foram ordenados.

    array(4) {
        [0]=> string(2) "10"
        [1]=> string(1) "a"
        [2]=> int(100)
        [3]=> int(100)
    }
    array(4) {
        [0]=> int(1)
        [1]=> int(1)
        [2]=> string(1) "2"
        [3]=> int(3)
    }

Exemplo 2. Ordenando um array multi-dimensional

`<?php $ar = array( array("10", 11, 100, 100, "a"), array( 1, 2, "2", 3, 1) ); array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); var_dump($ar); ?>`

Neste exemplo, depois de organizar, a primeira array se transformará em 10", 100, 100, 11, "a" (ela for ordenada com as strings em ordem ascendente). A segunda contém 1, 3, "2", 2, 1 (ordenada como números, em ordem descendente).

    array(2) {
        [0]=> array(5) {
        [0]=> string(2) "10"
        [1]=> int(100)
        [2]=> int(100)
        [3]=> int(11)
        [4]=> string(1) "a"
        }
        [1]=> array(5) {
            [0]=> int(1)
            [1]=> int(3)
            [2]=> string(1) "2"
            [3]=> int(2)
            [4]=> int(1)
        }
    }

Exemplo 3. ordenando resultados de um banco de dados

Para este exemplo, cada elemento na array `data` representa uma linha na tabela. Este tipo de conjunto de dados é tipico de um registro de banco de dados.

Dados do Exemplo:

    volume | edition
    -------+--------
        67 |       2
        86 |       1
        85 |       6
        98 |       2
        86 |       6
        67 |       7

Os dados como um array, chamado `data`. isto seria normalmente, por exemplo, obtico com um loop em mysql_fetch_assoc().

`<?php $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7); ?>`

neste exemplo, nós iremos ordenar por `volume` descendente, `edition` ascendente.

Nós temos uma matriz de linhas, mas array_multisort() requer uma matriz de colunas, assim nós usamos o código abaixo para obter colunas, e então realizar o ordenamento.

`<?php // Obter uma lista de colunas foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } // Ordena os dados com volume descendente, edition ascendente // adiciona $data como o último parãmetro, para ordenar pela chave comum array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); ?>`

O conjunto de dados agora stará ordenado, e agora vai ficar assim:

    volume | edition
    -------+--------
        98 |       2
        86 |       1
        86 |       6
        85 |       6
        67 |       2
        67 |       7

Exemplo 4. Ordenar sem diferenciar maiúsculas e minúsculas

Ambas `SORT_STRING` e `SORT_REGULAR` diferenciam maiúsculas e minúsculas, strings começando com uma letra maiúscula irão vir antes de uma string começando com uma letra minúscula.

Para ordenar sem diferenciar maiúsculas e minúsculas, force a ordem de ordenação para que seja determinada por uma cópia em minúscula da matriz original.

`<?php $array = array('Alpha', 'atomic', 'Beta', 'bank'); $array_lowercase = array_map('strtolower', $array); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array); print_r($array); ?>`

O exemplo acima irá imprimir:

    Array
    (
        [0] => Alpha
        [1] => atomic
        [2] => bank
        [3] => Beta
    )

Anterior | Principal | Próxima
array_merge | Acima | array_pad