Resumo : neste tutorial, você aprenderá como usar a array_filter()
função PHP para filtrar elementos de um array usando uma função de retorno de chamada.
Introdução à função array_filter() do PHP
Quando você deseja filtrar elementos de um array , você frequentemente itera sobre os elementos e verifica se o array resultante deve incluir cada elemento.
O exemplo a seguir usa a foreach
instrução para iterar os elementos da $numbers
matriz e filtrar os números ímpares:
<?php
$numbers = [1, 2, 3, 4, 5];
$odd_numbers = [];
foreach ($numbers as $number) {
if ($number % 2 === 1) {
$odd_numbers[] = $number;
}
}
print_r($odd_numbers);
Linguagem de código: HTML, XML ( xml )
Saída:
Array
(
[0] => 1
[1] => 3
[2] => 5
)
Linguagem de código: PHP ( php )
A array_filter()
função torna o código menos detalhado e mais expressivo:
<?php
$numbers = [1, 2, 3, 4, 5];
$odd_numbers = array_filter(
$numbers,
function ($number) {
return $number % 2 === 1;
}
);
print_r($odd_numbers);
Linguagem de código: HTML, XML ( xml )
A partir do PHP 7.4, você pode usar a função arrow em vez da função anônima assim:
<?php
$numbers = [1, 2, 3, 4, 5];
$odd_numbers = array_filter(
$numbers,
fn ($number) => $number % 2 === 1
);
print_r($odd_numbers);
Linguagem de código: HTML, XML ( xml )
A array_filter()
função permite filtrar elementos de um array usando uma função de retorno de chamada.
O seguinte ilustra a sintaxe da array_filter()
função:
array_filter (
array $array ,
callable|null $callback = null ,
int $mode = 0
) : array
Linguagem de código: PHP ( php )
A array_filter()
função itera sobre os elementos de $array
e passa cada elemento para a $callback
função. Se a função de retorno de chamada retornar true
, a array_filter()
função incluirá o elemento na matriz de resultados.
Exemplos de funções PHP array_filter()
Vamos dar alguns exemplos para entender array_filter()
melhor a função.
1) Exemplo básico de função array_filter()
Para filtrar todos os números ímpares da $numbers
matriz, você usa a array_filter()
função da seguinte forma:
<?php
$numbers = [1, 2, 3, 4, 5];
$even_numbers = array_filter(
$numbers,
function ($number) {
return $number % 2 === 0;
}
);
print_r($even_numbers);
Linguagem de código: HTML, XML ( xml )
2) Usando callback como método de uma classe
Além de um retorno de chamada, você pode passar um método de uma classe para a array_filter()
função assim:
array_filter($items,[$instance,'callback']);
Linguagem de código: PHP ( php )
Por exemplo:
class Odd
{
public function isOdd($num)
{
return $num % 2 === 1;
}
}
Linguagem de código: PHP ( php )
A Odd
classe possui um método isOdd()
que retorna true
se o argumento for um número ímpar; caso contrário, ele retorna false
.
Para usar o isOdd()
método como retorno de chamada da array_filter()
função, você usa o seguinte formato:
<?php
class Odd
{
public function isOdd($num)
{
return $num % 2 === 1;
}
}
$numbers = [1, 2, 3, 4, 5];
$odd_numbers = array_filter(
$numbers,
[new Odd(), 'isOdd']
);
print_r($odd_numbers);
Linguagem de código: HTML, XML ( xml )
Se você tem uma classe que possui um método estático , você passa o método estático como retorno de chamada da array_filter()
função:
array_filter($array, ['Class','callback']);
Linguagem de código: PHP ( php )
Por exemplo:
<?php
class Even
{
public static function isEven($num)
{
return $num % 2 === 0;
}
}
Linguagem de código: HTML, XML ( xml )
A Even
classe possui um método estático isEven()
que retorna true
se o argumento for par; caso contrário, ele retorna false
.
O seguinte usa o isEven()
método estático como retorno de chamada da array_fitler()
função:
$even_numbers = array_filter($numbers, ['Even','isEven']);
Linguagem de código: PHP ( php )
A partir do PHP 5.3, se uma classe implementa o __invoke()
método mágico , você pode usá-lo como chamável. Por exemplo:
<?php
class Positive
{
public function __invoke($number)
{
return $number > 0;
}
}
Linguagem de código: HTML, XML ( xml )
Neste exemplo, a Positive
classe possui o __invoke()
método mágico que retorna true
se o argumento for positivo; caso contrário, retornará falso.
Você pode passar uma instância da Positive
classe para a array_filter()
função para incluir apenas números positivos na matriz de resultados.
<?php
class Positive
{
public function __invoke($number)
{
return $number > 0;
}
}
$numbers = [-1, -2, 0, 1, 2, 3];
$positives = array_filter($numbers, new Positive());
print_r($positives);
Linguagem de código: HTML, XML ( xml )
Saída:
Array
(
[3] => 1
[4] => 2
[5] => 3
)
Linguagem de código: PHP ( php )
Passando elementos para a função de retorno de chamada
Por padrão, a array_filter()
função passa o valor de cada elemento da matriz para a função de retorno de chamada para filtragem.
Às vezes, você deseja passar a chave, e não o valor, para a função de retorno de chamada. Neste caso, você pode passar ARRAY_FILTER_USE_KEY
como terceiro argumento da array_filter()
função. Por exemplo:
<?php
$inputs = [
'first' => 'John',
'last' => 'Doe',
'password' => 'secret',
'email' => '[email protected]'
];
$filtered = array_filter(
$inputs,
fn ($key) => $key !== 'password',
ARRAY_FILTER_USE_KEY
);
print_r($filtered);
Linguagem de código: HTML, XML ( xml )
Saída:
Array
(
[first] => John
[last] => Doe
[email] => [email protected]
)
Linguagem de código: PHP ( php )
Neste exemplo, $filtered
contém todos os elementos do $inputs
array, exceto o elemento cuja chave é password
.
Para passar a chave e o valor do elemento para a função de retorno de chamada, você passa o ARRAY_FILTER_USE_BOTH
valor como o terceiro argumento da array_filter()
função. Por exemplo:
<?php
$inputs = [
'first' => 'John',
'last' => 'Doe',
'password' => 'secret',
'email' => ''
];
$filtered = array_filter(
$inputs,
fn ($value, $key) => $value !== '' && $key !== 'password',
ARRAY_FILTER_USE_BOTH
);
print_r($filtered);
Linguagem de código: HTML, XML ( xml )
Saída:
Array
(
[first] => John
[last] => Doe
)
Linguagem de código: PHP ( php )
Neste tutorial, você aprendeu como usar a array_filter()
função PHP para filtrar elementos de um array usando um retorno de chamada.