Arrays indexados, associativos e multidimensionais

1. Introdução aos Arrays em PHP

Arrays são estruturas de dados fundamentais no PHP que permitem armazenar múltiplos valores em uma única variável. Diferentemente de muitas linguagens, os arrays no PHP são na verdade mapas ordenados que associam chaves a valores, combinando características de listas, dicionários e até mesmo conjuntos.

A principal vantagem dos arrays é a capacidade de organizar dados relacionados de forma eficiente, evitando a criação de dezenas de variáveis individuais. Em vez de declarar $aluno1, $aluno2, $aluno3, você pode usar $alunos[0], $alunos[1], $alunos[2].

A sintaxe para criar arrays evoluiu. Tradicionalmente usava-se a função array():

$frutas = array('maçã', 'banana', 'laranja');

Desde o PHP 5.4, a sintaxe com colchetes [] tornou-se preferida:

$frutas = ['maçã', 'banana', 'laranja'];

Os arrays aceitam chaves dos tipos int ou string, e valores de qualquer tipo (incluindo outros arrays, objetos, recursos, etc.). Quando nenhuma chave é especificada, o PHP atribui automaticamente índices numéricos começando em 0.

2. Arrays Indexados (Numéricos)

Arrays indexados utilizam números inteiros como chaves. São ideais para listas ordenadas de itens.

Criação e inicialização:

$dias = ['segunda', 'terça', 'quarta', 'quinta', 'sexta'];
$numeros = [10, 20, 30, 40, 50];

// Índices automáticos: 0, 1, 2, 3, 4
echo $dias[0]; // segunda
echo $numeros[2]; // 30

Adicionando elementos:

$cidades = ['São Paulo', 'Rio de Janeiro'];

// Adiciona ao final com colchetes vazios
$cidades[] = 'Belo Horizonte';

// Ou usando array_push
array_push($cidades, 'Curitiba', 'Porto Alegre');

print_r($cidades);
// ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'Curitiba', 'Porto Alegre']

Removendo elementos:

$pilha = ['a', 'b', 'c', 'd'];

// Remove o último elemento
$ultimo = array_pop($pilha); // $ultimo = 'd', $pilha = ['a', 'b', 'c']

// Remove o primeiro elemento
$primeiro = array_shift($pilha); // $primeiro = 'a', $pilha = ['b', 'c']

// Remove elemento específico
unset($pilha[1]); // Remove índice 1, $pilha = ['b']

3. Arrays Associativos

Arrays associativos usam strings como chaves, permitindo acesso semântico aos dados.

Criação e acesso:

$usuario = [
    'nome' => 'Maria Silva',
    'email' => 'maria@exemplo.com',
    'idade' => 28
];

echo $usuario['nome'];  // Maria Silva
echo $usuario['email']; // maria@exemplo.com

Modificação e remoção:

$config = [
    'host' => 'localhost',
    'porta' => 3306,
    'debug' => true
];

// Modificar valor
$config['porta'] = 5432;

// Adicionar novo par
$config['usuario'] = 'admin';

// Remover par
unset($config['debug']);

print_r($config);
// ['host' => 'localhost', 'porta' => 5432, 'usuario' => 'admin']

4. Arrays Multidimensionais

Arrays multidimensionais são arrays que contêm outros arrays como elementos, criando estruturas aninhadas.

Arrays indexados multidimensionais (matrizes):

$matriz = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

echo $matriz[0][1]; // 2 (linha 0, coluna 1)
echo $matriz[2][2]; // 9 (linha 2, coluna 2)

Arrays associativos multidimensionais (dados hierárquicos):

$turma = [
    'aluno1' => [
        'nome' => 'João',
        'notas' => [8.5, 7.0, 9.2],
        'aprovado' => true
    ],
    'aluno2' => [
        'nome' => 'Ana',
        'notas' => [6.0, 5.5, 7.8],
        'aprovado' => false
    ]
];

echo $turma['aluno1']['nome'];       // João
echo $turma['aluno2']['notas'][1];   // 5.5

5. Percorrendo Arrays com Loops

foreach para arrays indexados:

$cores = ['vermelho', 'azul', 'verde'];

foreach ($cores as $cor) {
    echo "Cor: $cor\n";
}

// Com índice
foreach ($cores as $indice => $cor) {
    echo "Posição $indice: $cor\n";
}

foreach para arrays associativos:

$produto = [
    'nome' => 'Notebook',
    'preco' => 3500.00,
    'estoque' => 15
];

foreach ($produto as $chave => $valor) {
    echo "$chave: $valor\n";
}

for com contador para arrays indexados:

$numeros = [10, 20, 30, 40, 50];
$total = count($numeros);

for ($i = 0; $i < $total; $i++) {
    echo "Elemento $i: {$numeros[$i]}\n";
}

Iterando em arrays multidimensionais (loops aninhados):

$alunos = [
    ['João', 8.5, 7.0],
    ['Maria', 9.0, 8.5],
    ['Pedro', 6.5, 7.5]
];

foreach ($alunos as $aluno) {
    echo "Aluno: {$aluno[0]}\n";
    for ($i = 1; $i < count($aluno); $i++) {
        echo "  Nota $i: {$aluno[$i]}\n";
    }
}

6. Funções Essenciais para Manipulação

Verificação:

$dados = ['nome' => 'Carlos', 'cidade' => null];

// isset retorna false para valores nulos
var_dump(isset($dados['cidade'])); // false

// array_key_exists verifica a chave independente do valor
var_dump(array_key_exists('cidade', $dados)); // true

// in_array verifica se valor existe
var_dump(in_array('Carlos', $dados)); // true

// count retorna número de elementos
echo count($dados); // 2

Ordenação:

$nomes = ['Zeca', 'Ana', 'Carlos', 'Beatriz'];

sort($nomes);          // Ordem crescente (modifica o array original)
print_r($nomes);       // ['Ana', 'Beatriz', 'Carlos', 'Zeca']

$idades = ['João' => 25, 'Ana' => 30, 'Zeca' => 22];

asort($idades);        // Ordena por valor, mantendo chaves
ksort($idades);        // Ordena por chave

// Versões reversas
rsort($nomes);         // Ordem decrescente
arsort($idades);       // Ordem decrescente por valor
krsort($idades);       // Ordem decrescente por chave

Extração e junção:

$pessoa = ['nome' => 'Lucas', 'idade' => 32, 'cidade' => 'SP'];

$chaves = array_keys($pessoa);     // ['nome', 'idade', 'cidade']
$valores = array_values($pessoa);  // ['Lucas', 32, 'SP']

$array1 = ['a', 'b', 'c'];
$array2 = [1, 2, 3];

$combinado = array_combine($array1, $array2);
// ['a' => 1, 'b' => 2, 'c' => 3]

$array3 = ['d', 'e'];
$unido = array_merge($array1, $array3);
// ['a', 'b', 'c', 'd', 'e']

7. Boas Práticas e Armadilhas Comuns

Diferença entre isset e array_key_exists:

$dados = ['nome' => 'João', 'email' => null];

// array_key_exists é mais seguro para verificar chaves
if (array_key_exists('email', $dados)) {
    echo "Chave 'email' existe, mas valor pode ser null";
}

// isset retorna false se valor for null
if (isset($dados['email'])) {
    echo "Este código nunca executa";
}

Cuidados com referências e cópias:

$original = [1, 2, 3];

// Cópia (comportamento padrão)
$copia = $original;
$copia[0] = 100;
echo $original[0]; // 1 (não foi alterado)

// Referência
$referencia = &$original;
$referencia[0] = 100;
echo $original[0]; // 100 (foi alterado)

Uso de print_r e var_dump para depuração:

$complexo = [
    'nomes' => ['Ana', 'João'],
    'matriz' => [[1,2], [3,4]]
];

echo "<pre>";
print_r($complexo);   // Formatação mais limpa e legível
var_dump($complexo);  // Mostra tipos e tamanhos (mais detalhado)
echo "</pre>";

Lembre-se sempre de que arrays em PHP são extremamente flexíveis — um mesmo array pode conter chaves numéricas e strings, valores de tipos diferentes e até mesmo outros arrays em qualquer nível de profundidade. Essa versatilidade, embora poderosa, exige cuidado para manter o código legível e previsível.

Referências