Funções de array
Esta aula aborda funções essenciais de array em PHP, incluindo array_map, array_filter, array_reduce, ordenação (sort, usort), array_merge e funções de busca. Você aprenderá a manipular arrays de forma eficiente com exemplos práticos.
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 crescenteO 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á existiremBusca
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
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]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]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'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, AnaDado 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 }