
Arrays em PHP
Por que arrays merecem a sua atenção total
Se você programa em PHP há mais de uma semana, já usou arrays. Se programa há mais de um mês, provavelmente já ficou preso depurando um array que não se comportava como esperava. Isso acontece porque arrays em PHP são, ao mesmo tempo, a estrutura de dados mais simples e a mais complexa da linguagem.
Diferente de linguagens como Java ou C++, onde arrays são coleções de tamanho fixo com tipo definido, o PHP trata arrays como mapas ordenados: estruturas que podem armazenar qualquer tipo de valor, crescer dinamicamente, misturar chaves numéricas e textuais, e ser percorridas de múltiplas formas. Essa flexibilidade é um presente e uma armadilha ao mesmo tempo.
Neste guia, você vai aprender não só o que arrays são, mas como pensá-los, manipulá-los com eficiência e evitar os erros que custam horas de debug. Vamos cobrir desde a criação básica até técnicas avançadas com funções funcionais, passando por performance, boas práticas e casos de uso reais.
Para quem é este guia
Desenvolvedores PHP de qualquer nível que querem ir além do básico e entender arrays com profundidade. Todo exemplo é compatível com PHP 7.4+ e testado no PHP 8.3.
1. O que é um array em PHP, de verdade
A documentação oficial do PHP define array como “um mapa ordenado que associa valores a chaves”. Essa definição é mais profunda do que parece. Em outras linguagens, um array é uma sequência contígua de memória. No PHP, um array é uma tabela hash com ordem de inserção preservada. Isso significa que:
- Chaves podem ser inteiros ou strings
- A ordem de inserção é sempre mantida
- Valores podem ser de qualquer tipo, inclusive outros arrays
- O mesmo array pode ter chaves numéricas e textuais ao mesmo tempo
Internamente, o PHP implementa arrays usando a estrutura HashTable, que combina uma tabela hash para acesso rápido por chave com uma lista duplamente encadeada para preservar a ordem. Isso garante acesso em O(1) por chave e percurso em ordem O(n).
Essa arquitetura tem uma consequência importante: arrays PHP são copiados por valor, não por referência. Quando você atribui um array a outra variável, o PHP usa um mecanismo chamado copy-on-write: a cópia real só acontece quando uma das variáveis é modificada. Isso torna a cópia barata enquanto os dados não mudam.
<?php
$a = [1, 2, 3];
$b = $a; // nenhuma cópia acontece aqui (copy-on-write)
$b[] = 4; // só agora o PHP duplica internamentevar_dump($a); // [1, 2, 3] - não foi alterado
var_dump($b); // [1, 2, 3, 4]
?>
1.1 Os três sabores de array
Na prática, arrays PHP se apresentam em três formas, cada uma com um uso natural:
Array indexado
O tipo mais familiar: uma lista de valores com índices numéricos automáticos começando em zero.
<?php
$linguagens = ['PHP', 'Python', 'JavaScript', 'Go'];echo $linguagens[0]; // PHP
echo $linguagens[3]; // Go
echo count($linguagens); // 4
?>
Array associativo
Um mapa de chave-valor onde as chaves são strings com significado semântico. É o equivalente PHP de um dicionário (Python), objeto simples (JavaScript) ou HashMap (Java).
<?php
$usuario = [
'nome' => 'Carla Mendes',
'email' => 'carla@exemplo.com',
'idade' => 32,
'ativo' => true,
];echo $usuario['nome']; // Carla Mendes
echo $usuario['idade']; // 32
?>
Array multidimensional
Arrays que contêm outros arrays como valores. Representam dados hierárquicos como tabelas de banco de dados, respostas de APIs JSON ou estruturas em árvore.
<?php
$pedidos = [
['id' => 1, 'produto' => 'Notebook', 'valor' => 3500.00],
['id' => 2, 'produto' => 'Mouse', 'valor' => 89.90],
['id' => 3, 'produto' => 'Teclado', 'valor' => 149.90],
];echo $pedidos[0]['produto']; // Notebook
echo $pedidos[2]['valor']; // 149.90
?>
2. Criando e acessando arrays
2.1 Sintaxes de criação
O PHP aceita duas sintaxes para criar arrays. A sintaxe moderna com colchetes (disponível desde PHP 5.4) é preferível pela legibilidade:
<?php
// Sintaxe moderna (recomendada)
$frutas = ['maçã', 'banana', 'uva'];// Sintaxe antiga com array()
$frutas = array('maçã', 'banana', 'uva');// Array vazio
$vazio = [];// Array com índices personalizados
$semana = [1 => 'segunda', 2 => 'terça', 3 => 'quarta'];
?>
2.2 Acesso e modificação
O acesso a elementos usa colchetes com a chave. Para arrays aninhados, encadeie os colchetes:
<?php
$config = [
'banco' => [
'host' => 'localhost',
'porta' => 3306,
'credenciais' => [
'usuario' => 'root',
'senha' => 'secreto'
]
]
];// Acesso aninhado
echo $config['banco']['host']; // localhost
echo $config['banco']['credenciais']['usuario']; // root// Modificação
$config['banco']['porta'] = 5432;// Adicionar nova chave
$config['banco']['nome'] = 'meu_banco';
?>
Dica de segurança
Nunca armazene senhas em texto puro em arrays de configuração. Use variáveis de ambiente com getenv() ou uma biblioteca como vlucas/phpdotenv.
2.3 Null coalescing para acesso seguro
Acessar uma chave inexistente gera um aviso no PHP 8. Use o operador ?? para fornecer um valor padrão de forma elegante:
<?php
$dados = ['nome' => 'João'];// Sem proteção - gera aviso se 'email' não existir
$email = $dados['email']; // Warning!// Com null coalescing
$email = $dados['email'] ?? 'não informado';// Encadeado para arrays aninhados
$cidade = $dados['endereco']['cidade'] ?? 'desconhecida';
?>
3. Adicionando e removendo elementos
3.1 Inserindo elementos
O PHP oferece várias formas de inserir elementos dependendo de onde você quer inseri-los:
<?php
$nums = [2, 3, 4];// Adicionar ao final (as duas formas são equivalentes)
$nums[] = 5;
array_push($nums, 6, 7); // pode empurrar vários de uma vez// Adicionar ao início
array_unshift($nums, 0, 1);// Resultado: [0, 1, 2, 3, 4, 5, 6, 7]// Inserir no meio com array_splice
$letras = ['a', 'b', 'd', 'e'];
array_splice($letras, 2, 0, ['c']); // inserir 'c' na posição 2
// ['a', 'b', 'c', 'd', 'e']
?>
3.2 Removendo elementos
<?php
$nums = [1, 2, 3, 4, 5];// Remover o último elemento e retornar seu valor
$ultimo = array_pop($nums); // $ultimo = 5, $nums = [1,2,3,4]// Remover o primeiro elemento e retornar seu valor
$primeiro = array_shift($nums); // $primeiro = 1, $nums = [2,3,4]// Remover por índice (não reindexar)
unset($nums[1]); // remove índice 1, deixa buraco nos índices// Remover e reindexar
array_splice($nums, 1, 1); // remove 1 elemento da posição 1
?>
Cuidado com unset()
O unset() remove o elemento mas não reindexa o array. Se você precisar que os índices sejam sequenciais após a remoção, use array_values() para reindexar ou prefira array_splice().
4. Percorrendo arrays com foreach e além
4.1 O foreach e suas variantes
O foreach é o laço preferido para percorrer arrays no PHP. Ele é mais legível, menos propenso a erros de índice e funciona tanto com arrays indexados quanto associativos:
<?php
// Percorrer apenas valores
$cores = ['azul', 'verde', 'vermelho'];
foreach ($cores as $cor) {
echo $cor . PHP_EOL;
}// Percorrer chave e valor
$precos = ['maçã' => 3.50, 'banana' => 1.20, 'uva' => 6.00];
foreach ($precos as $fruta => $preco) {
printf('%s custa R$ %.2f%s', $fruta, $preco, PHP_EOL);
}// Modificar por referência (use &)
$numeros = [1, 2, 3, 4, 5];
foreach ($numeros as &$numero) {
$numero *= 2;
}
unset($numero); // IMPORTANTE: quebrar a referência após o loop
// $numeros = [2, 4, 6, 8, 10]
?>
4.2 Percorrendo arrays multidimensionais
<?php
$funcionarios = [
['nome' => 'Ana', 'depto' => 'TI', 'salario' => 8500],
['nome' => 'Bruno', 'depto' => 'RH', 'salario' => 6200],
['nome' => 'Carla', 'depto' => 'TI', 'salario' => 9100],
['nome' => 'Daniel', 'depto' => 'Vendas', 'salario' => 7300],
];// Calcular total de salários do departamento de TI
$totalTI = 0;
foreach ($funcionarios as $func) {
if ($func['depto'] === 'TI') {
$totalTI += $func['salario'];
}
}
echo 'Total TI: R$ ' . number_format($totalTI, 2, ',', '.'); // R$ 17.600,00
?>
5. Funções essenciais de array
O PHP possui mais de 80 funções nativas para manipulação de arrays. Conhecer as principais muda completamente a qualidade e a velocidade do seu código. Vamos cobrir as mais importantes por categoria.
5.1 Ordenação
O PHP oferece diversas funções de ordenação, cada uma com um comportamento específico em relação às chaves:
| Função | Mantém chaves? | Uso |
|---|---|---|
sort() | Não | Ordena valores crescente, reindexa |
rsort() | Não | Ordena valores decrescente, reindexa |
asort() | Sim | Ordena valores crescente, preserva chaves |
arsort() | Sim | Ordena valores decrescente, preserva chaves |
ksort() | Sim | Ordena por chave crescente |
usort() | Não | Ordena com função personalizada |
uasort() | Sim | Ordena com função personalizada, preserva chaves |
<?php
// Ordenar array de produtos por preço (crescente)
$produtos = [
['nome' => 'Teclado', 'preco' => 149.90],
['nome' => 'Monitor', 'preco' => 1299.00],
['nome' => 'Mouse', 'preco' => 89.90],
];usort($produtos, fn($a, $b) => $a['preco'] <=> $b['preco']);// Resultado: Mouse (89.90), Teclado (149.90), Monitor (1299.00)
foreach ($produtos as $p) {
echo $p['nome'] . ': R$ ' . $p['preco'] . PHP_EOL;
}
?>
5.2 Busca e filtragem
<?php
$nomes = ['Ana', 'Bruno', 'Carla', 'Ana', 'Daniel'];// Verificar se valor existe
in_array('Bruno', $nomes); // true
in_array('Eduardo', $nomes); // false// Busca com strict type checking
in_array('1', [1, 2, 3]); // true (loose)
in_array('1', [1, 2, 3], true); // false (strict)// Obter a chave do valor encontrado
$chave = array_search('Carla', $nomes); // 2// Filtrar com critério personalizado
$maiores = ['Alice' => 28, 'Bob' => 17, 'Carol' => 34, 'Dave' => 15];
$adultos = array_filter($maiores, fn($idade) => $idade >= 18);
// ['Alice' => 28, 'Carol' => 34]
?>
5.3 Transformação com array_map
O array_map aplica uma função a cada elemento do array e retorna um novo array com os resultados. É ideal para transformações limpas sem efeitos colaterais:
<?php
$precos = [100, 200, 350, 500];// Aplicar desconto de 10%
$comDesconto = array_map(fn($p) => $p * 0.90, $precos);
// [90, 180, 315, 450]// Trabalhar com múltiplos arrays
$quantidades = [2, 1, 3, 2];
$totais = array_map(fn($p, $q) => $p * $q, $precos, $quantidades);
// [200, 200, 1050, 1000]// Aplicar função nativa
$nomes = [' Ana ', 'BRUNO', 'carla'];
$normalizados = array_map('trim', $nomes);
$normalizados = array_map('strtolower', $normalizados);
// ['ana', 'bruno', 'carla']
?>
5.4 Redução com array_reduce
O array_reduce é a navalha suíça das funções de array. Ele percorre o array acumulando um único valor. Qualquer operação de agregação (soma, produto, máximo, concat) pode ser feita com ele:
<?php
$pedido = [
['produto' => 'Notebook', 'valor' => 3500, 'qtd' => 1],
['produto' => 'Mouse', 'valor' => 90, 'qtd' => 2],
['produto' => 'Mochila', 'valor' => 200, 'qtd' => 1],
];// Calcular valor total do pedido
$total = array_reduce($pedido, function($carry, $item) {
return $carry + ($item['valor'] * $item['qtd']);
}, 0);echo 'Total: R$ ' . number_format($total, 2, ',', '.'); // R$ 3.880,00
?>
5.5 Combinação e divisão
<?php
// Unir dois arrays (chaves iguais: o segundo sobrescreve)
$padrao = ['cor' => 'azul', 'tam' => 'M', 'estoque' => true];
$personalizado = ['cor' => 'vermelho', 'tam' => 'G'];
$final = array_merge($padrao, $personalizado);
// ['cor' => 'vermelho', 'tam' => 'G', 'estoque' => true]// Combinar dois arrays em chave-valor
$chaves = ['nome', 'idade', 'cidade'];
$valores = ['Maria', 25, 'Curitiba'];
$pessoa = array_combine($chaves, $valores);
// ['nome' => 'Maria', 'idade' => 25, 'cidade' => 'Curitiba']// Extrair uma fatia
$nums = [10, 20, 30, 40, 50, 60];
$fatia = array_slice($nums, 1, 3); // [20, 30, 40]
$fim = array_slice($nums, -2); // [50, 60]// Dividir em blocos (para paginação, por exemplo)
$itens = range(1, 10);
$paginas = array_chunk($itens, 3);
// [[1,2,3], [4,5,6], [7,8,9], [10]]
?>
5.6 Array e string: implode e explode
A conversão entre strings e arrays é uma das operações mais comuns em PHP, especialmente ao processar entradas de formulários, CSV ou parâmetros de URL:
<?php
// Array para string
$tags = ['php', 'arrays', 'backend', 'web'];
echo implode(', ', $tags); // php, arrays, backend, web
echo implode(' | ', $tags); // php | arrays | backend | web// String para array
$csv = 'Ana,28,Engenheira,São Paulo';
[$nome, $idade, $cargo, $cidade] = explode(',', $csv);// Limitar o número de partes
$url = 'https://exemplo.com/produtos/notebook/preto';
$partes = explode('/', $url, 4);
// ['https:', '', 'exemplo.com', 'produtos/notebook/preto']// Processar CSV completo
$linhas = "Ana,28\nBruno,32\nCarla,25";
$pessoas = array_map(
fn($linha) => explode(',', $linha),
explode("\n", $linhas)
);
?>
6. Técnicas avançadas
6.1 Programação funcional com arrays
Uma das evoluções mais importantes do PHP moderno foi a incorporação de paradigmas funcionais no trabalho com arrays. Combinando array_map, array_filter e array_reduce, é possível escrever pipelines de transformação de dados que são legíveis, testáveis e sem efeitos colaterais.
<?php
// Cenário: processar relatório de vendas
$vendas = [
['vendedor' => 'Ana', 'valor' => 12500, 'mes' => 'jan', 'meta' => 10000],
['vendedor' => 'Bruno', 'valor' => 8200, 'mes' => 'jan', 'meta' => 10000],
['vendedor' => 'Carla', 'valor' => 15800, 'mes' => 'jan', 'meta' => 12000],
['vendedor' => 'Daniel', 'valor' => 9100, 'mes' => 'fev', 'meta' => 10000],
];// 1. Filtrar apenas vendas de janeiro
$janeiro = array_filter($vendas, fn($v) => $v['mes'] === 'jan');// 2. Filtrar quem bateu a meta
$bateram = array_filter($janeiro, fn($v) => $v['valor'] >= $v['meta']);// 3. Extrair apenas os nomes
$nomes = array_map(fn($v) => $v['vendedor'], $bateram);// 4. Formatar para exibição
echo 'Bateram a meta em jan: ' . implode(', ', $nomes);
// Ana, Carla
?>
6.2 Desestruturação de arrays
O PHP 7.1 introduziu a desestruturação com colchetes, similar ao destructuring do JavaScript. Ela elimina código repetitivo ao extrair múltiplos valores de um array:
<?php
// Desestruturação simples
$ponto = [10, 25];
[$x, $y] = $ponto;
echo "X: $x, Y: $y"; // X: 10, Y: 25// Ignorar elementos
$dados = ['Ana', 32, 'Engenheira', 'SP'];
[$nome, , $cargo] = $dados; // ignora a idade// Desestruturação de array associativo
$config = ['host' => 'localhost', 'porta' => 3306, 'banco' => 'loja'];
['host' => $host, 'banco' => $banco] = $config;
echo "$host/$banco"; // localhost/loja// Em foreach
$pontos = [[1, 2], [3, 4], [5, 6]];
foreach ($pontos as [$x, $y]) {
echo "($x, $y) ";
}
?>
6.3 Spread operator em arrays (PHP 8.1+)
O operador spread (...) permite expandir um array dentro de outro, substituindo em muitos casos o array_merge de forma mais legível:
<?php
$base = [1, 2, 3];
$extra = [4, 5, 6];// Equivalente a array_merge, mas mais legível
$completo = [...$base, ...$extra];
// [1, 2, 3, 4, 5, 6]// Com arrays associativos (PHP 8.1+)
$padrao = ['timeout' => 30, 'retries' => 3];
$custom = ['timeout' => 60];
$config = [...$padrao, ...$custom];
// ['timeout' => 60, 'retries' => 3]
?>
6.4 array_column: extraindo colunas de arrays 2D
Uma das funções mais subestimadas do PHP. O array_column extrai uma coluna de um array multidimensional, com a opção de reindexar por outra coluna:
<?php
$usuarios = [
['id' => 1, 'nome' => 'Ana', 'email' => 'ana@ex.com'],
['id' => 2, 'nome' => 'Bruno', 'email' => 'bruno@ex.com'],
['id' => 3, 'nome' => 'Carla', 'email' => 'carla@ex.com'],
];// Extrair todos os nomes
$nomes = array_column($usuarios, 'nome');
// ['Ana', 'Bruno', 'Carla']// Reindexar por ID
$porId = array_column($usuarios, null, 'id');
// [1 => ['id'=>1,'nome'=>'Ana',...], 2 => [...], ...]// Extrair emails indexados por nome
$emailsPorNome = array_column($usuarios, 'email', 'nome');
// ['Ana' => 'ana@ex.com', 'Bruno' => 'bruno@ex.com', ...]
?>
7. Performance e boas práticas
7.1 Quando arrays começam a custar caro
Arrays PHP são versáteis, mas não gratuitos. Cada elemento de um array PHP 7+ ocupa em torno de 40 bytes de memória. Um array com 1 milhão de inteiros pode facilmente consumir 40 MB. Para comparação, o mesmo dado em um array tipado de C ocuparia menos de 8 MB.
Isso não é motivo para evitar arrays, mas é motivo para usá-los com consciência. Aqui estão os princípios que separam código bom de código eficiente:
- Preferência por leitura única: se você precisa percorrer um resultado de banco de dados apenas uma vez, use generators em vez de carregar tudo em array.
- Evite cópias desnecessárias: passe arrays grandes por referência (
&$array) em funções que precisam modificá-los. - Use
isset()em vez dearray_key_exists()quando possível:isset()é cerca de 2x mais rápido (mas retorna false para valoresnull). - Pré-aloque quando o tamanho é conhecido: embora o PHP não ofereça pré-alocação explícita, reduzir reatribuições dentro de loops melhora a performance.
7.2 Boas práticas de nomenclatura e estrutura
<?php
// Ruim: nome genérico, sem clareza sobre o conteúdo
$data = [...];
$arr = [...];
$list = [...];// Bom: nome plural e descritivo
$usuarios = [...];
$produtosAtivos = [...];
$errosDeValidacao = [...];// Ruim: misturar tipos no mesmo array
$info = ['Ana', 28, true, null];// Bom: estrutura consistente e previsível
$usuario = [
'nome' => 'Ana',
'idade' => 28,
'ativo' => true,
];
?>
7.3 Validação robusta de arrays
Arrays provenientes de entrada externa (formulários, APIs, arquivos) nunca devem ser confiados sem validação. O PHP oferece ferramentas nativas para isso:
<?php
function validarUsuario(array $dados): array {
$erros = []; if (empty($dados['nome']) || strlen($dados['nome']) < 2) {
$erros[] = 'Nome inválido';
} if (!filter_var($dados['email'] ?? '', FILTER_VALIDATE_EMAIL)) {
$erros[] = 'E-mail inválido';
} $idade = filter_var($dados['idade'] ?? 0, FILTER_VALIDATE_INT);
if ($idade === false || $idade < 18 || $idade > 120) {
$erros[] = 'Idade inválida';
} return $erros;
}$erros = validarUsuario($_POST);
if (!empty($erros)) {
foreach ($erros as $erro) {
echo "Erro: $erro" . PHP_EOL;
}
}
?>
8. Casos de uso reais
8.1 Agrupando dados por categoria
Um padrão extremamente comum em aplicações PHP: receber uma lista plana de dados e agrupá-los por algum critério, como categoria, status ou departamento.
<?php
$produtos = [
['nome' => 'iPhone 15', 'categoria' => 'Celular', 'preco' => 5999],
['nome' => 'Galaxy S24', 'categoria' => 'Celular', 'preco' => 4799],
['nome' => 'MacBook Air', 'categoria' => 'Notebook', 'preco' => 9999],
['nome' => 'Dell XPS 13', 'categoria' => 'Notebook', 'preco' => 7499],
['nome' => 'iPad Pro', 'categoria' => 'Tablet', 'preco' => 4299],
];// Agrupar por categoria
$porCategoria = [];
foreach ($produtos as $produto) {
$porCategoria[$produto['categoria']][] = $produto;
}// Calcular preço médio por categoria
foreach ($porCategoria as $cat => $items) {
$media = array_sum(array_column($items, 'preco')) / count($items);
printf('%s: R$ %.2f média%s', $cat, $media, PHP_EOL);
}
?>
8.2 Construindo um sistema simples de cache em memória
Arrays podem funcionar como cache em memória dentro de uma requisição, evitando chamadas repetidas ao banco de dados ou a APIs externas:
<?php
class CacheDeUsuario {
private array $cache = []; public function buscar(int $id): array {
if (!isset($this->cache[$id])) {
// Simula busca no banco
$this->cache[$id] = $this->buscarNoBanco($id);
}
return $this->cache[$id];
} public function invalidar(int $id): void {
unset($this->cache[$id]);
} public function limparTudo(): void {
$this->cache = [];
} private function buscarNoBanco(int $id): array {
// Aqui viria a query real
return ['id' => $id, 'nome' => 'Usuário ' . $id];
}
}
?>
8.3 Processando JSON de uma API
Praticamente toda integração moderna com APIs retorna JSON. O PHP converte JSON em arrays associativos com json_decode:
<?php
// Simula resposta de uma API
$json = '{
"status": "ok",
"total": 3,
"dados": [
{"id": 1, "nome": "Produto A", "estoque": 45},
{"id": 2, "nome": "Produto B", "estoque": 0},
{"id": 3, "nome": "Produto C", "estoque": 12}
]
}';$resposta = json_decode($json, true); // true = array associativoif ($resposta['status'] !== 'ok') {
throw new RuntimeException('API retornou erro');
}// Filtrar produtos sem estoque
$semEstoque = array_filter(
$resposta['dados'],
fn($p) => $p['estoque'] === 0
);echo 'Produtos sem estoque: ' . count($semEstoque);
?>
9. Erros comuns e como evitá-los
9.1 O perigo do foreach por referência sem unset
Um dos bugs mais traiçoeiros do PHP. Quando você usa & no foreach, a variável do loop continua sendo uma referência após o loop terminar. Se você usar esse nome de variável depois, vai corromper o último elemento do array:
<?php
$nums = [1, 2, 3, 4, 5];foreach ($nums as &$num) {
$num *= 2;
}
// ERRO: esqueceu o unset(&$num)!foreach ($nums as $num) { // $num ainda é referência ao último elemento!
echo $num . ' ';
}
// Resultado inesperado: 2 4 6 8 8 (o último elemento fica dobrado)// CORRETO:
foreach ($nums as &$num) { $num *= 2; }
unset($num); // sempre faça isso após foreach por referência
?>
9.2 Confundir == com ===
O PHP tem comparação fraca (==) e estrita (===) para arrays. A comparação fraca pode gerar surpresas:
<?php
$a = [1, 2, 3];
$b = ['1', '2', '3'];var_dump($a == $b); // true (PHP converte tipos)
var_dump($a === $b); // false (tipos diferentes)// Ordem importa no ===
$x = ['a' => 1, 'b' => 2];
$y = ['b' => 2, 'a' => 1];var_dump($x == $y); // true (mesmos pares chave-valor)
var_dump($x === $y); // false (ordem diferente)
?>
9.3 Modificar array durante o foreach
Modificar um array enquanto o percorre com foreach pode gerar comportamentos inesperados. O PHP trabalha com uma cópia interna do array durante o loop:
<?php
// EVITE: modificar o array original dentro do foreach
$items = [1, 2, 3, 4, 5];
foreach ($items as $key => $val) {
if ($val % 2 === 0) {
unset($items[$key]); // pode causar comportamento imprevisível
}
}// PREFERÍVEL: filtrar antes
$impares = array_filter($items, fn($v) => $v % 2 !== 0);
?>
10. Arrays vs. outras estruturas de dados
O PHP oferece a SPL (Standard PHP Library) com estruturas de dados especializadas que podem ser mais eficientes que arrays em cenários específicos:
| Estrutura | Melhor para | Pior para | Memória |
|---|---|---|---|
| Array PHP | Uso geral, flexibilidade | Dados massivos tipados | Alta |
SplDoublyLinkedList | Inserções no meio | Acesso aleatório | Média |
SplStack | Pilha LIFO | Acesso por índice | Baixa |
SplQueue | Fila FIFO | Acesso aleatório | Baixa |
SplFixedArray | Dados numéricos fixos | Tamanho dinâmico | Muito baixa |
Na prática, arrays PHP cobrem 95% dos casos de uso do dia a dia. As estruturas SPL fazem sentido em sistemas com requisitos de performance muito específicos ou quando o domínio do problema mapeia naturalmente para uma pilha ou fila.
Conclusão
Arrays são muito mais do que listas de valores. São a espinha dorsal de quase toda aplicação PHP: estão no processamento de formulários, na manipulação de resultados de banco de dados, na integração com APIs, na construção de sistemas de cache e em dezenas de outros contextos.
O que diferencia um desenvolvedor PHP iniciante de um experiente não é apenas conhecer a sintaxe, mas saber quando usar cada função, como escrever pipelines de transformação legíveis, como evitar os bugs clássicos e como tomar decisões conscientes sobre performance.
Neste guia, você viu desde a arquitetura interna (HashTable com copy-on-write) até técnicas modernas como desestruturação, spread operator e programação funcional. A mensagem central é esta: domine arrays e você dominará boa parte do PHP.
O próximo passo natural é aprender como arrays se encaixam na Orientação a Objetos, especialmente ao trabalhar com coleções de objetos, o padrão Repository e a interface Countable do PHP. Mas isso é assunto para o próximo artigo.