Uso de PHP

Resumo : neste tutorial, você aprenderá como usar a usort()função PHP para classificar um array usando uma função de comparação definida pelo usuário.

Introdução à função usort() do PHP

Até agora, você aprendeu como classificar um array usando um operador de comparação integrado.

Por exemplo, quando você usa a função para classificar uma matriz de números, o PHP usa o operador de comparaçãosort() integrado para comparar os números.

Para especificar uma função de comparação personalizada para classificação, use a usort()função:

usort(array &$array, callable $callback): boolLinguagem de código:  PHP  ( php )

A usort()função possui dois parâmetros:

  • $arrayé a matriz de entrada.
  • $callbacké a função de comparação personalizada.

A usort()função retorna trueem caso de sucesso falseou falha.

O $callbacktem a seguinte sintaxe:

callback(mixed $x, mixed $y): intLinguagem de código:  PHP  ( php )

A $callbackfunção possui dois parâmetros que são os elementos do array a serem comparados.

A $callbackfunção compara dois elementos ( $xe $y) e retorna um valor inteiro:

  • zero (0) significa que $xé igual a $y.
  • um número negativo significa $xque é antes $y.
  • um número positivo significa que $xestá depois $y.

Exemplos de funções PHP usort()

Vejamos alguns exemplos de uso da usort()função.

1) Usando a função PHP usort() para classificar um array de números

O exemplo a seguir ilustra como usar a usort()função para classificar uma matriz de números:

<?php

$numbers = [2, 1, 3];

usort($numbers, function ($x, $y) {
    if ($x === $y) {
        return 0;
    }
    return $x < $y ? -1 : 1;
});

print_r($numbers);Linguagem de código:  PHP  ( php )

Saída:

Array
(
    [0] => 1   
    [1] => 2   
    [2] => 3   
)    Linguagem de código:  PHP  ( php )

Como funciona.

  • Primeiro, defina uma matriz de três números 2, 1 e 3.
  • Segundo, use a usort()função para classificar o $numbersarray. A função de retorno de chamada retorna 0 se dois números forem iguais, -1 se o primeiro número for menor que o segundo e 1 se o primeiro número for maior que o segundo.

Para classificar os elementos do array em ordem decrescente, basta alterar a lógica na função de comparação assim:

<?php

$numbers = [2, 1, 3];

usort($numbers, function ($x, $y) {
    if ($x === $y) {
        return 0;
    }
    return $x < $y ? 1 : -1;
});

print_r($numbers);Linguagem de código:  PHP  ( php )

Se você usa PHP 7 ou mais recente, você pode usar o operador nave espacial ( <=>) para tornar o código mais conciso:

$x <=> $yLinguagem de código:  PHP  ( php )

O operador nave espacial compara duas expressões e retorna -1, 0 ou 1 quando $xé respectivamente menor que, igual ou maior que $y. Por exemplo:

<?php

$numbers = [2, 1, 3];

usort($numbers, function ($x, $y) {
    return $x <=> $y;
});

print_r($numbers);Linguagem de código:  PHP  ( php )

Se o retorno de chamada for simples, você pode usar uma função de seta como esta:

<?php

$numbers = [2, 1, 3];
usort($numbers, fn ($x, $y) =>  $x <=> $y);

print_r($numbers);Linguagem de código:  PHP  ( php )

Observe que o PHP introduziu as funções de seta desde o PHP 7.4.

2) Usando a função PHP usort() para classificar um array de strings por comprimento

O exemplo a seguir usa a usort()função para classificar uma matriz de nomes por comprimento:

<?php

$names = [ 'Alex', 'Peter',  'John' ];
usort($names, fn($x,$y) => strlen($x) <=> strlen($y));

var_dump($names);Linguagem de código:  PHP  ( php )

Saída:

Array(3) 
{
    [0]=>  string(4) "Alex"
    [1]=>  string(4) "John"
    [2]=>  string(5) "Peter"
}Linguagem de código:  PHP  ( php )

3) Usando a função PHP usort() para classificar um array de objetos

O exemplo a seguir usa a usort()função para classificar uma matriz de Personobjetos pela agepropriedade.

<?php

class Person
{
    public $name;
    public $age;

    public function __construct(string $name, int $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

$group = [
    new Person('Bob', 20),
    new Person('Alex', 25),
    new Person('Peter', 30),
];

usort($group, fn($x, $y) => $x->age <=> $y->age);

print_r($group);Linguagem de código:  PHP  ( php )

Saída:

Array
(
    [0] => Person Object
        (
            [name] => Bob
            [age] => 20
        )
    [1] => Person Object
        (
            [name] => Alex
            [age] => 25
        )
    [2] => Person Object
        (
            [name] => Peter
            [age] => 30
        )
)Linguagem de código:  PHP  ( php )

Como funciona.

  • Primeiro, defina uma Personclasse que possua duas propriedades: namee age.
  • Segundo, defina o $grouparray que contém os Personobjetos.
  • Terceiro, use a usort()função para classificar os Personobjetos do $grouparray. A usort()função usa uma função de comparação que compara a idade de dois Personobjetos.

Se você quiser classificar os Personobjetos por nome, você pode comparar $namena comparação assim:

usort($group, fn($x, $y) => $x->name <=> $y->name);Linguagem de código:  PHP  ( php )

Usando um método estático como retorno de chamada

O exemplo a seguir usa um método estático de classe como retorno de chamada para a usort()função:

<?php

class Person
{
    public $name;

    public $age;

    public function __construct(string $name, int $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

class PersonComparer
{
    public static function compare(Person $x, Person $y)
    {
        return $x->age <=> $y->age;
    }
}

$group = [
    new Person('Bob', 20),
    new Person('Alex', 25),
    new Person('Peter', 30),
];

usort($group, ['PersonComparer', 'compare']);

print_r($group);Linguagem de código:  PHP  ( php )

Neste exemplo, definimos a PersonComparerclasse que contém o compare()método estático.

O compare()método estático compara dois Personobjetos por idade usando o operador nave espacial.

Para usar o compare()método estático da PersonComparerclasse como retorno de chamada da usort()função, você passa um array que contém dois elementos:

usort($group, ['PersonComparer', 'compare']);Linguagem de código:  PHP  ( php )

O primeiro elemento é o nome da classe e o segundo é o método estático.

Resumo

  • Use a função PHP usort()para classificar um array usando uma função de comparação definida pelo usuário.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *