Arrays são uma das estruturas de dados mais versáteis em PHP. Para manipulá-los de forma eficiente, a linguagem oferece um vasto conjunto de funções nativas. Nesta aula, exploraremos as funções mais úteis para transformar, filtrar, reduzir, ordenar, combinar e buscar elementos em arrays. Compreender essas funções é essencial para escrever código PHP mais limpo, expressivo e funcional.

Dominar essas funções permite que você evite loops manuais e adote uma abordagem mais declarativa, similar ao que se faz em linguagens funcionais. Além disso, muitas dessas funções são otimizadas internamente, resultando em melhor desempenho.

array_map, array_filter, array_reduce

Essas três funções formam o tripé da programação funcional em PHP. Elas permitem aplicar transformações, filtrar elementos e reduzir um array a um único valor, respectivamente.

array_map aplica uma função de callback a cada elemento de um ou mais arrays, retornando um novo array com os resultados. O número de arrays passados deve corresponder ao número de parâmetros esperados pela função callback.

$numeros = [1, 2, 3, 4, 5];
$quadrados = array_map(fn($n) => $n * $n, $numeros);
print_r($quadrados); // [1, 4, 9, 16, 25]

array_filter filtra elementos de um array usando uma função de callback. A função deve retornar true para manter o elemento ou false para removê-lo. Se nenhum callback for fornecido, remove valores considerados falsy (false, null, '', 0, array vazio).

$numeros = [1, 2, 3, 4, 5, 6];
$pares = array_filter($numeros, fn($n) => $n % 2 == 0);
print_r($pares); // [1 => 2, 3 => 4, 5 => 6] (preserva chaves)

array_reduce reduz um array a um único valor usando uma função de callback que acumula o resultado. A função recebe o valor acumulado e o elemento atual, e deve retornar o novo valor acumulado. Um valor inicial opcional pode ser passado como terceiro argumento.

$numeros = [1, 2, 3, 4, 5];
$soma = array_reduce($numeros, fn($acc, $n) => $acc + $n, 0);
echo $soma; // 15

Essas funções são imutáveis: não alteram o array original, mas retornam novos arrays ou valores. Isso é uma boa prática, pois evita efeitos colaterais.

Ordenação (sort, usort)

PHP oferece diversas funções de ordenação, que se diferenciam pelo comportamento em relação às chaves e pela possibilidade de usar critérios personalizados.

sort ordena um array indexado numericamente em ordem crescente, reindexando as chaves. Para ordem decrescente, use rsort. Essas funções modificam o array original e retornam true em caso de sucesso.

$frutas = ['laranja', 'abacaxi', 'banana', 'maçã'];
sort($frutas);
print_r($frutas); // ['abacaxi', 'banana', 'laranja', 'maçã']

usort permite ordenar um array usando uma função de comparação personalizada. A função deve receber dois elementos e retornar um inteiro negativo, zero ou positivo, dependendo se o primeiro é menor, igual ou maior que o segundo. É útil para ordenar arrays associativos ou com critérios complexos.

$pessoas = [
    ['nome' => 'João', 'idade' => 30],
    ['nome' => 'Maria', 'idade' => 25],
    ['nome' => 'Pedro', 'idade' => 35]
];
usort($pessoas, fn($a, $b) => $a['idade'] <=> $b['idade']);
print_r($pessoas); // Maria, João, Pedro

Para manter a associação entre chaves e valores após a ordenação, use asort (ordem crescente) e arsort (decrescente). Para ordenar por chaves, use ksort e krsort.

array_merge

array_merge combina um ou mais arrays em um único array. Se os arrays tiverem chaves string idênticas, o valor posterior sobrescreve o anterior. Para chaves numéricas, os valores são reindexados e adicionados ao final.

$a = [1, 2, 3];
$b = [4, 5, 6];
$c = array_merge($a, $b);
print_r($c); // [1, 2, 3, 4, 5, 6]

$d = ['cor' => 'vermelho', 'tamanho' => 'M'];
$e = ['cor' => 'azul', 'peso' => 100];
$f = array_merge($d, $e);
print_r($f); // ['cor' => 'azul', 'tamanho' => 'M', 'peso' => 100]

Se você deseja preservar chaves numéricas sem reindexar, use o operador +, que mantém o primeiro valor encontrado para cada chave. array_merge também pode ser usado para converter um array em uma lista plana, embora existam funções específicas como array_values.

Busca

PHP fornece várias funções para buscar elementos em arrays. As mais comuns são in_array, array_search, array_key_exists e array_keys.

in_array verifica se um valor existe em um array, retornando true ou false. O terceiro parâmetro opcional strict (boolean) habilita a comparação estrita de tipos.

$frutas = ['maçã', 'banana', 'laranja'];
if (in_array('banana', $frutas)) {
    echo 'Tem banana!';
}

array_search busca por um valor e retorna a chave correspondente, ou false se não encontrado. Também aceita strict.

$chave = array_search('banana', $frutas); // 1

array_key_exists verifica se uma chave existe em um array, independentemente do valor ser null. Já isset não retorna true para chaves com valor null.

$arr = ['a' => 1, 'b' => null];
var_dump(array_key_exists('b', $arr)); // true
var_dump(isset($arr['b'])); // false

array_keys retorna todas as chaves de um array. Se um valor for passado como segundo argumento, retorna apenas as chaves que correspondem a esse valor.

$arr = ['nome' => 'João', 'idade' => 25, 'cidade' => 'São Paulo'];
print_r(array_keys($arr)); // ['nome', 'idade', 'cidade']

Essas funções são essenciais para consultar e validar dados em arrays.

Boas Práticas e Observações Finais

Ao usar funções de array, prefira as que retornam novos arrays (imutáveis) sempre que possível, para evitar efeitos colaterais. Use funções como array_map e array_filter para transformar dados de forma declarativa. Para ordenação, lembre-se de que sort e usort modificam o array original; se precisar manter o original, faça uma cópia antes. Ao buscar valores, considere o uso de strict para evitar falsos positivos com tipos diferentes. Por fim, consulte a documentação oficial para explorar variações como array_udiff, array_intersect, entre outras.

Exercícios

  1. Dado o array $numeros = [10, 20, 30, 40, 50]; use array_map para criar um novo array com o dobro de cada número. Imprima o resultado.

    ✓ Resposta:
    $numeros = [10, 20, 30, 40, 50];
    $dobro = array_map(fn($n) => $n * 2, $numeros);
    print_r($dobro); // [20, 40, 60, 80, 100]
  2. Use array_filter para obter apenas os números pares do array $valores = [1, 2, 3, 4, 5, 6]; e preserve as chaves.

    ✓ Resposta:
    $valores = [1, 2, 3, 4, 5, 6];
    $pares = array_filter($valores, fn($v) => $v % 2 == 0);
    print_r($pares); // [1 => 2, 3 => 4, 5 => 6]
  3. Calcule o produto de todos os números do array $nums = [2, 3, 4]; usando array_reduce.

    ✓ Resposta:
    $nums = [2, 3, 4];
    $produto = array_reduce($nums, fn($acc, $n) => $acc * $n, 1);
    echo $produto; // 24
  4. Ordene o array de pessoas abaixo por idade em ordem decrescente usando usort.

    $pessoas = [
        ['nome' => 'Ana', 'idade' => 28],
        ['nome' => 'Carlos', 'idade' => 22],
        ['nome' => 'Beatriz', 'idade' => 35]
    ];

    ✓ Resposta:
    usort($pessoas, fn($a, $b) => $b['idade'] <=> $a['idade']);
    print_r($pessoas);
    // Resultado: Beatriz (35), Ana (28), Carlos (22)
  5. Dado o array $dados = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 2]; encontre todas as chaves que correspondem ao valor 2 usando array_keys.

    ✓ Resposta:
    $dados = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 2];
    $chaves = array_keys($dados, 2);
    print_r($chaves); // ['b', 'd']

Referências