Nesta aula, vamos explorar funções poderosas para manipulação de arrays em PHP. Arrays são estruturas de dados fundamentais, e o PHP oferece um conjunto rico de funções para transformá-los, filtrá-los, ordená-los, combiná-los e buscar elementos. Dominar essas funções é essencial para escrever código conciso e eficiente.

Vamos começar com as funções de ordem superior que permitem aplicar lógica a cada elemento, depois veremos ordenação, combinação e busca. Cada função será explicada com exemplos práticos para que você entenda seu uso no dia a dia.

array_map, array_filter, array_reduce

Essas três funções são inspiradas no paradigma funcional e permitem processar arrays sem a necessidade de loops explícitos. Elas recebem uma função callback que é aplicada aos elementos.

array_map aplica uma função a cada elemento de um ou mais arrays, retornando um novo array com os resultados. É útil para transformar dados.

$numeros = [1, 2, 3, 4];
$quadrados = array_map(function($n) {
    return $n * $n;
}, $numeros);
// Resultado: [1, 4, 9, 16]

array_filter filtra elementos de um array usando uma função callback que retorna true para manter o elemento. Se nenhum callback for fornecido, remove valores considerados false (0, null, false, '').

$numeros = [1, 2, 3, 4, 5, 6];
$pares = array_filter($numeros, function($n) {
    return $n % 2 === 0;
});
// Resultado: [1 => 2, 3 => 4, 5 => 6] (mantém as chaves)

// Para reindexar:
$pares = array_values($pares);
// Resultado: [0 => 2, 1 => 4, 2 => 6]

array_reduce reduz um array a um único valor usando uma função acumuladora. É útil para somas, produtos, concatenações, etc.

$numeros = [1, 2, 3, 4];
$soma = array_reduce($numeros, function($carry, $item) {
    return $carry + $item;
}, 0);
// Resultado: 10

// Exemplo com string:
$palavras = ['PHP', 'é', 'legal'];
$frase = array_reduce($palavras, function($carry, $item) {
    return $carry . ' ' . $item;
}, '');
// Resultado: ' PHP é legal'

Ordenação (sort, usort)

O PHP oferece várias funções de ordenação. As mais comuns são sort (ordena arrays indexados numericamente) e usort (ordena com uma função de comparação personalizada).

sort ordena um array em ordem crescente (por valores) e reindexa as chaves. Existem variações como rsort (decrescente), asort (mantém associação de chaves), ksort (ordena por chaves), etc.

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

usort permite definir uma função de comparação para critérios complexos. A função recebe dois elementos e deve retornar um inteiro menor, igual ou maior que zero.

$pessoas = [
    ['nome' => 'João', 'idade' => 25],
    ['nome' => 'Maria', 'idade' => 30],
    ['nome' => 'Ana', 'idade' => 20]
];

usort($pessoas, function($a, $b) {
    return $a['idade'] <=> $b['idade'];
});
print_r($pessoas);
// Resultado: ordenado por idade crescente

O operador spaceship (<=>) retorna -1, 0 ou 1, facilitando a comparação. Para ordem decrescente, inverta a ordem: $b <=> $a.

array_merge

array_merge combina dois ou mais arrays em um único. Se os arrays tiverem as mesmas chaves string, a última sobrescreve a anterior. Para chaves numéricas, os valores são reindexados.

$array1 = ['cor' => 'vermelho', 2, 4];
$array2 = ['a', 'b', 'cor' => 'verde', 'forma' => 'círculo', 4];
$resultado = array_merge($array1, $array2);
print_r($resultado);
/*
Resultado:
[
    'cor' => 'verde',
    0 => 2,
    1 => 4,
    2 => 'a',
    3 => 'b',
    'forma' => 'círculo',
    4 => 4
]
*/

Note que a chave 'cor' foi sobrescrita pelo valor do segundo array. Para preservar chaves numéricas, use o operador +, mas ele não sobrescreve chaves existentes.

$resultado = $array1 + $array2;
// Mantém chaves do primeiro array, ignorando as do segundo se já existirem

Busca

O PHP oferece funções para buscar valores ou chaves em arrays. As principais são in_array, array_search, array_key_exists e array_keys.

in_array verifica se um valor existe no array (busca por valor). Retorna true ou false.

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

array_search retorna a chave do valor encontrado, ou false se não existir. Cuidado: false pode ser confundido com 0, use operador ===.

$chave = array_search('banana', $frutas);
if ($chave !== false) {
    echo "A chave é $chave"; // 1
}

array_key_exists verifica se uma chave existe no array (busca por chave).

$dados = ['nome' => 'João', 'idade' => 25];
if (array_key_exists('nome', $dados)) {
    echo 'Chave nome existe';
}

array_keys retorna todas as chaves de um array. Opcionalmente, pode buscar chaves de um valor específico.

$chaves = array_keys($dados); // ['nome', 'idade']
$chaves = array_keys($dados, 'João'); // [0 => 'nome']

Outra função útil é array_column (para arrays multidimensionais) que extrai uma coluna de valores.

$pessoas = [
    ['id' => 1, 'nome' => 'João'],
    ['id' => 2, 'nome' => 'Maria']
];
$nomes = array_column($pessoas, 'nome'); // ['João', 'Maria']

Boas práticas

Ao usar funções de array, prefira funções nativas a loops manuais sempre que possível, pois são otimizadas e mais legíveis. Lembre-se de que funções como array_map e array_filter não modificam o array original, retornam um novo. Para arrays muito grandes, considere o uso de generators para economizar memória. Sempre verifique o tipo de retorno (false vs 0) ao usar array_search.

Exercícios

  1. Dado um array de números [1, 2, 3, 4, 5], use array_map para criar um novo array com cada número elevado ao cubo.

    ✓ Resposta:
    $numeros = [1, 2, 3, 4, 5];
    $cubos = array_map(function($n) {
        return $n ** 3;
    }, $numeros);
    print_r($cubos); // [1, 8, 27, 64, 125]
  2. Use array_filter para obter apenas os números ímpares do array [1, 2, 3, 4, 5, 6].

    ✓ Resposta:
    $numeros = [1, 2, 3, 4, 5, 6];
    $impares = array_filter($numeros, function($n) {
        return $n % 2 !== 0;
    });
    $impares = array_values($impares);
    print_r($impares); // [1, 3, 5]
  3. Dado um array de palavras ['PHP', 'é', 'poderoso'], use array_reduce para concatená-las em uma string separada por espaços.

    ✓ Resposta:
    $palavras = ['PHP', 'é', 'poderoso'];
    $frase = array_reduce($palavras, function($carry, $item) {
        return $carry === '' ? $item : $carry . ' ' . $item;
    }, '');
    echo $frase; // 'PHP é poderoso'
  4. Ordene o array de pessoas por nome em ordem decrescente usando usort.

    $pessoas = [
        ['nome' => 'João', 'idade' => 25],
        ['nome' => 'Maria', 'idade' => 30],
        ['nome' => 'Ana', 'idade' => 20]
    ];

    ✓ Resposta:
    usort($pessoas, function($a, $b) {
        return $b['nome'] <=> $a['nome'];
    });
    print_r($pessoas);
    // Ordem: Maria, João, Ana
  5. Dado o array associativo $dados = ['nome' => 'Carlos', 'cidade' => 'São Paulo', 'idade' => 28], verifique se a chave 'cidade' existe e encontre a chave do valor 'Carlos'.

    ✓ Resposta:
    $dados = ['nome' => 'Carlos', 'cidade' => 'São Paulo', 'idade' => 28];
    
    // Verificar se chave existe
    if (array_key_exists('cidade', $dados)) {
        echo "Chave 'cidade' existe\n";
    }
    
    // Encontrar chave do valor
    $chave = array_search('Carlos', $dados);
    if ($chave !== false) {
        echo "Valor 'Carlos' está na chave: $chave"; // nome
    }

Referências