PHP

Arrays em Profundidade Já leu

11 min de leitura

Arrays em Profundidade
Arrays são a estrutura de dados mais usada no PHP. Praticamente tudo que você fará com o PHP — ler dados de um banco, processar um for

Arrays são a estrutura de dados mais usada no PHP. Praticamente tudo que você fará com o PHP — ler dados de um banco, processar um formulário, construir uma resposta de API — vai envolver arrays de alguma forma. Entender arrays com profundidade não é opcional: é o que separa quem apenas usa PHP de quem realmente o domina.

Neste artigo vamos cobrir criação, acesso, modificação, arrays associativos, multidimensionais e o conjunto de funções nativas que tornam os arrays do PHP tão poderosos.


Criando arrays

O PHP suporta duas sintaxes para criar arrays. A sintaxe com colchetes [] é a moderna e preferida:

<?php
declare(strict_types=1);

// Sintaxe moderna — preferida desde PHP 5.4
$frutas = ["maçã", "banana", "laranja"];

// Sintaxe antiga — ainda funciona, mas evite em código novo
$frutas = array("maçã", "banana", "laranja");

// Array vazio — comum para inicializar antes de preencher
$resultado = [];

// Array com índices explícitos
// Os índices não precisam ser sequenciais
$sparse = [0 => "zero", 5 => "cinco", 10 => "dez"];

// PHP atribui o próximo índice inteiro após o maior existente
$sparse[] = "onze"; // receberá índice 11

// Verificando se é array e seu tamanho
var_dump(is_array($frutas)); // bool(true)
echo count($frutas);         // 3
echo count([]);              // 0

Arrays associativos

Arrays associativos usam strings como chaves em vez de índices numéricos. São equivalentes a dicionários ou mapas em outras linguagens:

<?php
declare(strict_types=1);

// Criando com chaves string
$usuario = [
    "nome"    => "Ana Silva",
    "email"   => "ana@email.com",
    "idade"   => 28,
    "ativo"   => true,
];

// Acessando por chave
echo $usuario["nome"];   // Ana Silva
echo $usuario["idade"];  // 28

// Modificando um valor existente
$usuario["idade"] = 29;

// Adicionando uma nova chave
$usuario["perfil"] = "administrador";

// Removendo uma chave
unset($usuario["ativo"]);

// Verificando se uma chave existe
var_dump(isset($usuario["email"]));          // bool(true)
var_dump(isset($usuario["ativo"]));          // bool(false) — removido
var_dump(array_key_exists("email", $usuario)); // bool(true) — mais preciso que isset

// Listando chaves e valores separadamente
$chaves  = array_keys($usuario);   // ["nome", "email", "idade", "perfil"]
$valores = array_values($usuario); // ["Ana Silva", "ana@email.com", 29, "administrador"]

A diferença entre isset() e array_key_exists() é sutil mas importante: isset() retorna false se a chave existir mas seu valor for null. array_key_exists() retorna true independentemente do valor — verifique apenas se a chave existe.


Arrays multidimensionais

Arrays podem conter outros arrays como valores, criando estruturas multidimensionais. Esse é o padrão usado para representar dados relacionais — exatamente o que vem de um banco de dados:

<?php
declare(strict_types=1);

// Array de arrays associativos — estrutura típica de resultado de banco
$usuarios = [
    [
        "id"    => 1,
        "nome"  => "Ana",
        "email" => "ana@email.com",
        "cargo" => ["titulo" => "Desenvolvedora", "nivel" => "Senior"],
    ],
    [
        "id"    => 2,
        "nome"  => "Bruno",
        "email" => "bruno@email.com",
        "cargo" => ["titulo" => "Designer", "nivel" => "Pleno"],
    ],
];

// Acessando dados aninhados com múltiplos colchetes
echo $usuarios[0]["nome"];              // Ana
echo $usuarios[0]["cargo"]["titulo"];   // Desenvolvedora
echo $usuarios[1]["cargo"]["nivel"];    // Pleno

// Iterando estrutura multidimensional
foreach ($usuarios as $usuario) {
    // $usuario é um array associativo
    echo "{$usuario['nome']} — {$usuario['cargo']['titulo']}\n";
}
// Ana — Desenvolvedora
// Bruno — Designer

// array_column — extrai uma coluna de um array multidimensional
// Equivale a: SELECT nome FROM usuarios
$nomes = array_column($usuarios, "nome");
print_r($nomes); // ["Ana", "Bruno"]

// Também pode usar uma coluna como índice do resultado
$porId = array_column($usuarios, null, "id");
// Agora $porId[1] é o array do usuário com id=1
echo $porId[1]["nome"]; // Ana

Adicionando e removendo elementos

<?php
declare(strict_types=1);

$pilha = ["a", "b", "c"];

// Adicionando ao final
$pilha[] = "d";          // forma mais comum
array_push($pilha, "e"); // equivalente, mas [] é preferido

// Removendo do final — retorna o elemento removido
$ultimo = array_pop($pilha); // "e"

// Adicionando ao início
array_unshift($pilha, "z"); // $pilha = ["z", "a", "b", "c", "d"]

// Removendo do início — retorna o elemento removido
$primeiro = array_shift($pilha); // "z"

// Removendo por índice específico
// unset remove o elemento mas não reindexia
unset($pilha[1]); // remove "b", índices ficam: 0=>"a", 2=>"c", 3=>"d"

// array_splice — remove e opcionalmente insere, reindexia automaticamente
// array_splice($array, $inicio, $quantidade, $substituicao)
$cores = ["vermelho", "verde", "azul", "amarelo"];
$removidas = array_splice($cores, 1, 2); // remove 2 a partir do índice 1
// $cores = ["vermelho", "amarelo"]
// $removidas = ["verde", "azul"]

// Inserindo no meio com array_splice
array_splice($cores, 1, 0, ["roxo", "laranja"]); // insere sem remover
// $cores = ["vermelho", "roxo", "laranja", "amarelo"]

Funções essenciais de array

O PHP tem mais de 70 funções nativas para arrays. Aqui estão as mais importantes:

Busca e verificação

<?php
declare(strict_types=1);

$numeros = [10, 20, 30, 40, 50];
$frutas  = ["maçã", "banana", "laranja"];

// in_array — verifica se um valor existe
var_dump(in_array(30, $numeros));         // bool(true)
var_dump(in_array("banana", $frutas));    // bool(true)
var_dump(in_array("uva", $frutas));       // bool(false)

// Terceiro argumento true = comparação estrita (===)
var_dump(in_array("30", $numeros));        // bool(true) — coerção!
var_dump(in_array("30", $numeros, true));  // bool(false) — estrito

// array_search — retorna a chave do elemento encontrado, ou false
$posicao = array_search(30, $numeros);
var_dump($posicao); // int(2)

$ausente = array_search(99, $numeros);
var_dump($ausente); // bool(false)

// Cuidado: posição 0 e false são ambos falsy!
// Use === false para verificar ausência
if (array_search(10, $numeros) !== false) {
    echo "Encontrado!\n";
}

Ordenação

<?php
declare(strict_types=1);

$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
$nomes   = ["Carlos", "Ana", "Beatriz", "David"];

// sort — ordena por valor, reindexia (destrói chaves originais)
sort($numeros);    // [1, 1, 2, 3, 4, 5, 6, 9]
sort($nomes);      // ["Ana", "Beatriz", "Carlos", "David"]

// rsort — ordem decrescente
rsort($numeros);   // [9, 6, 5, 4, 3, 2, 1, 1]

// asort — ordena por valor, PRESERVA as chaves
$notas = ["Ana" => 9.5, "Bruno" => 7.0, "Carla" => 8.5];
asort($notas);
// ["Bruno" => 7.0, "Carla" => 8.5, "Ana" => 9.5]

// arsort — ordem decrescente, preserva chaves
arsort($notas);
// ["Ana" => 9.5, "Carla" => 8.5, "Bruno" => 7.0]

// ksort — ordena por chave
$config = ["z_timeout" => 30, "a_host" => "localhost", "m_port" => 3306];
ksort($config);
// ["a_host" => ..., "m_port" => ..., "z_timeout" => ...]

// usort — ordenação customizada com função de comparação
$usuarios = [
    ["nome" => "Carlos", "idade" => 35],
    ["nome" => "Ana",    "idade" => 28],
    ["nome" => "Bruno",  "idade" => 42],
];

// Ordena por idade usando spaceship operator
usort($usuarios, fn(array $a, array $b): int => $a["idade"] <=> $b["idade"]);
// Ana(28), Carlos(35), Bruno(42)

Transformação

<?php
declare(strict_types=1);

$numeros = [1, 2, 3, 4, 5];
$precos  = [10.0, 25.5, 8.0, 42.0, 15.0];

// array_map — aplica função a cada elemento, retorna novo array
$dobrados = array_map(fn(int $n): int => $n * 2, $numeros);
// [2, 4, 6, 8, 10]

// array_map com múltiplos arrays
$a = [1, 2, 3];
$b = [10, 20, 30];
$soma = array_map(fn(int $x, int $y): int => $x + $y, $a, $b);
// [11, 22, 33]

// array_filter — mantém apenas os elementos que passam no teste
$pares = array_filter($numeros, fn(int $n): bool => $n % 2 === 0);
// [2, 4] — note: chaves originais são preservadas (1 e 3)

// array_values reindexia após filter
$pares = array_values(array_filter($numeros, fn(int $n): bool => $n % 2 === 0));
// [2, 4] com índices 0 e 1

// array_reduce — reduz o array a um único valor
$total = array_reduce($precos, fn(float $carry, float $item): float => $carry + $item, 0.0);
echo $total; // 100.5

// Calculando média com array_reduce
$media = array_reduce($precos, fn(float $carry, float $item): float => $carry + $item, 0.0) / count($precos);
echo $media; // 20.1

// array_unique — remove valores duplicados
$comDuplicatas = [1, 2, 2, 3, 3, 3, 4];
$unicos = array_unique($comDuplicatas);
// [1, 2, 3, 4]

Fatiamento e combinação

<?php
declare(strict_types=1);

$letras = ["a", "b", "c", "d", "e", "f"];

// array_slice — extrai uma porção do array
$parte = array_slice($letras, 1, 3);       // ["b", "c", "d"]
$final = array_slice($letras, -2);          // ["e", "f"] — índice negativo
$reindexa = array_slice($letras, 2, 3, true); // preserva chaves originais

// array_merge — une dois ou mais arrays
$a = ["maçã", "banana"];
$b = ["laranja", "uva"];
$c = array_merge($a, $b); // ["maçã", "banana", "laranja", "uva"]

// Com arrays associativos — chaves repetidas: o segundo sobrescreve
$padroes = ["tema" => "claro", "idioma" => "pt-BR", "itens" => 10];
$config   = ["tema" => "escuro", "debug" => true];
$final    = array_merge($padroes, $config);
// ["tema" => "escuro", "idioma" => "pt-BR", "itens" => 10, "debug" => true]

// Operador + — alternativo ao merge: a chave do primeiro vence
$final2 = $padroes + $config;
// ["tema" => "claro", "idioma" => "pt-BR", "itens" => 10, "debug" => true]

// array_combine — cria associativo a partir de dois arrays (chaves + valores)
$chaves  = ["nome", "email", "cidade"];
$valores = ["Ana", "ana@email.com", "São Paulo"];
$pessoa  = array_combine($chaves, $valores);
// ["nome" => "Ana", "email" => "ana@email.com", "cidade" => "São Paulo"]

// array_chunk — divide em pedaços
$numeros = [1, 2, 3, 4, 5, 6, 7];
$grupos  = array_chunk($numeros, 3);
// [[1,2,3], [4,5,6], [7]]

Funções de contagem e matemática

<?php
declare(strict_types=1);

$valores = [5, 3, 8, 1, 9, 2, 7, 4, 6];
$precos  = [10.5, 25.0, 8.75, 42.0];

echo count($valores);       // 9 — número de elementos
echo array_sum($precos);    // 86.25 — soma de todos os elementos
echo array_product([1,2,3,4]); // 24 — produto de todos os elementos
echo min($valores);          // 1 — menor valor
echo max($valores);          // 9 — maior valor

// Funções que funcionam com arrays
$arredondados = array_map(fn(float $p): float => round($p, 1), $precos);

// compact e extract — atalhos para criar arrays de variáveis
$nome   = "Ana";
$idade  = 28;
$cidade = "São Paulo";

// compact cria array associativo a partir de variáveis
$dados = compact("nome", "idade", "cidade");
// ["nome" => "Ana", "idade" => 28, "cidade" => "São Paulo"]

// extract faz o inverso — cria variáveis a partir de array
// Use com cuidado: pode sobrescrever variáveis existentes
extract($dados); // cria $nome, $idade, $cidade no escopo atual

Padrões práticos com arrays

<?php
declare(strict_types=1);

// Agrupando dados por critério
$transacoes = [
    ["tipo" => "entrada", "valor" => 500.0],
    ["tipo" => "saida",   "valor" => 120.0],
    ["tipo" => "entrada", "valor" => 300.0],
    ["tipo" => "saida",   "valor" => 80.0],
];

$grupos = [];
foreach ($transacoes as $t) {
    // Agrupa pelo campo "tipo"
    $grupos[$t["tipo"]][] = $t["valor"];
}

// $grupos = [
//   "entrada" => [500.0, 300.0],
//   "saida"   => [120.0, 80.0]
// ]

$totalEntradas = array_sum($grupos["entrada"]); // 800.0
$totalSaidas   = array_sum($grupos["saida"]);   // 200.0

// Pipeline funcional — filtrar, transformar, reduzir
$produtos = [
    ["nome" => "Teclado",  "preco" => 250.0, "ativo" => true],
    ["nome" => "Mouse",    "preco" => 80.0,  "ativo" => false],
    ["nome" => "Monitor",  "preco" => 1200.0,"ativo" => true],
    ["nome" => "Headset",  "preco" => 350.0, "ativo" => true],
];

// Soma o preço dos produtos ativos com preço abaixo de R$500
$totalAtivosBaratos = array_reduce(
    array_filter(
        $produtos,
        fn(array $p): bool => $p["ativo"] && $p["preco"] < 500.0
    ),
    fn(float $carry, array $p): float => $carry + $p["preco"],
    0.0
);

echo $totalAtivosBaratos; // 600.0 (Teclado 250 + Headset 350)

Resumo

Função O que faz
count() Número de elementos
in_array($val, $arr, true) Verifica se valor existe (use true para strict)
array_search() Retorna a chave do valor encontrado
array_key_exists() Verifica se chave existe (mesmo se valor for null)
array_keys() / array_values() Extrai chaves ou valores
array_column() Extrai coluna de array multidimensional
sort() / rsort() Ordena por valor (reindexia)
asort() / arsort() Ordena por valor (preserva chaves)
usort() Ordenação customizada com callback
array_map() Transforma cada elemento
array_filter() Filtra elementos por condição
array_reduce() Reduz a um único valor
array_merge() Une arrays
array_slice() Extrai porção do array
array_chunk() Divide em grupos de N elementos
array_unique() Remove duplicatas
array_push() / array_pop() Adiciona/remove do final
array_unshift() / array_shift() Adiciona/remove do início

Referências e leituras para aprofundar

Comentários

Mais em PHP

Configurando o Ambiente de Desenvolvimento
Configurando o Ambiente de Desenvolvimento

Antes de escrever qualquer programa, voc&ecirc; precisa de um ambiente onde o...

Traits Avançados
Traits Avançados

Traits s&atilde;o o mecanismo do PHP para reutiliza&ccedil;&atilde;o horizont...

Exceções Avançadas
Exceções Avançadas

Tratamento de erros &eacute; onde c&oacute;digo bom se separa de c&oacute;dig...