usort

(PHP 3>= 3.0.3, PHP 4 )

usort --  Ordena um array pelos valores utilizando uma função de comparação definida pelo usuário

Descrição

void usort ( array array, string cmp_function)

Essa função irá ordenar um array pelos valores usando uma função de classificação definida pelo usuário. Se o array precisar ser ordenado utilizando um critério não trivial, você deve usar essa função.

A função de comparação deve retornar um inteiro menor, igual ou maior que zero se o primeiro argumento for considerado respectivamente menor, igual, ou maior que o segundo.

Nota: Se dois elementos são considerados iguais, a ordem deles fica indefinida no array resultante. Até o PHP 4.0.6 as funções definidas pelo usuário manteriam a ordem original desses elementos, mas com o novo algoritmo de ordenação introduzido no 4.1.0 esse não é o caso, pois não existe solução para fazer isso de modo eficiente.

Exemplo 1. Exemplo de usort()

function cmp ($a, $b) {   
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (3, 2, 5, 6, 1);

usort ($a, "cmp");

while (list ($chave, $valor) = each ($a)) {
    echo "$chave: $valor\n";
}

Esse exemplo mostraria:

0: 6
1: 5
2: 3
3: 2
4: 1

Nota: Obviamente que nesse caso trivial a função rsort() seria mais apropriada.

Exemplo 2. Exemplo de usort() usando um array multi-dimensional

function cmp ($a, $b) {
    return strcmp($a["fruta"], $b["fruta"]);
} 

$frutas[0]["fruta"] = "limoes";
$frutas[1]["fruta"] = "abacaxis";
$frutas[2]["fruta"] = "goiabas";

usort($frutas, "cmp"); 

while (list ($chave, $valor) = each ($frutas)) {
    echo "\$frutas[$chave]: " . $valor["fruta"] . "\n";
}

Na ordenação de um array multi-dimensional, $a e $b contêm referências para o primeiro índice do array.

Esse exemplo mostraria:

$fruits[0]: abacaxis
$fruits[1]: goiabas
$fruits[2]: limoes

Nota: Ao invés de um nome de função, um array contendo uma referência de objeto e ao nome de método também pode ser fornecidos.

Exemplo 3. Exemplo de usort() usando uma função membro de um objeto

class TestObj {
    var $name;

    function TestObj($name)
    {
        $this->name = $name;
    }

    /* Essa é a função estática de comparação */
    function cmp_obj($a, $b)
    {
        $al = strtolower($a->name);
        $bl = strtolower($b->name);
        if ($al == $bl) return 0;
        return ($al > $bl) ? +1 : -1;
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

uasort($a, array ("TestObj", "cmp_obj"));

foreach ($a as $item) {
    print $item->name."\n";
}

Esse exemplo mostraria:

b
c
d

Veja também uasort(), uksort(), sort(), asort(), arsort(),ksort(), natsort(), e rsort().