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): bool
Linguagem 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 true
em caso de sucesso false
ou falha.
O $callback
tem a seguinte sintaxe:
callback(mixed $x, mixed $y): int
Linguagem de código: PHP ( php )
A $callback
função possui dois parâmetros que são os elementos do array a serem comparados.
A $callback
função compara dois elementos ( $x
e $y
) e retorna um valor inteiro:
- zero (0) significa que
$x
é igual a$y
. - um número negativo significa
$x
que é antes$y
. - um número positivo significa que
$x
está 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$numbers
array. 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 <=> $y
Linguagem 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 Person
objetos pela age
propriedade.
<?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
Person
classe que possua duas propriedades:name
eage
. - Segundo, defina o
$group
array que contém osPerson
objetos. - Terceiro, use a
usort()
função para classificar osPerson
objetos do$group
array. Ausort()
função usa uma função de comparação que compara a idade de doisPerson
objetos.
Se você quiser classificar os Person
objetos por nome, você pode comparar $name
na 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 PersonComparer
classe que contém o compare()
método estático.
O compare()
método estático compara dois Person
objetos por idade usando o operador nave espacial.
Para usar o compare()
método estático da PersonComparer
classe 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.