Como verificar se é um array associativo em PHP: erros comuns

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como verificar se um array é associativo ou sequencial em PHP: analisando os principais erros

\n\n

Você já escreveu um foreach e obteve um resultado inesperado? Ou talvez passou um array para uma função que esperava uma lista, mas recebeu um array associativo com chaves de string? Se sim, você não está sozinho. A pergunta "How to check if PHP array is associative or sequential?" está entre as mais populares no Stack Overflow, com milhares de visualizações. E não é por acaso: a confusão entre tipos de arrays é uma das principais armadilhas para desenvolvedores PHP.

\n\n

Neste artigo, vamos explorar as diferenças entre arrays associativos e sequenciais, mostrar erros comuns e fornecer soluções práticas. Vamos nessa!

\n\n

O que é um array sequencial e um array associativo?

\n\n

No PHP, não há uma separação rigorosa entre "listas" e "dicionários", como em Python ou JavaScript. Um único tipo — array — pode ser ambos. Mas, na prática, é importante entender a diferença:

\n\n
    \n
  • Array sequencial — as chaves seguem uma ordem: 0, 1, 2, 3... sem lacunas. Exemplo: ['maçã', 'pera', 'cereja'].
  • \n
  • Array associativo — as chaves são strings ou números fora de ordem. Exemplo: ['nome' => 'João', 'idade' => 30].
  • \n
\n\n

Parece simples, certo? Mas, na prática, os desenvolvedores frequentemente cometem erros ao tentar determinar o tipo de array manualmente. Vamos analisar os erros mais comuns.

\n\n

Erro nº 1: Usar array_keys() e comparar com range

\n\n

Uma das abordagens mais comuns é pegar as chaves do array, gerar uma sequência de 0 a count($array)-1 e comparar. Parece lógico, mas tem suas nuances.

\n\n
// Exemplo de abordagem incorreta\nfunction isSequential($arr) {\n    return array_keys($arr) === range(0, count($arr) - 1);\n}\n\n$test = ['a', 'b', 'c'];\nvar_dump(isSequential($test)); // true — correto\n\n$test2 = ['x' => 1, 'y' => 2];\nvar_dump(isSequential($test2)); // false — correto\n\n$test3 = [0 => 'a', 2 => 'b'];\nvar_dump(isSequential($test3)); // false — correto\n\n$test4 = ['0' => 'a', '1' => 'b'];\nvar_dump(isSequential($test4)); // ??? \n
\n\n

O problema é que o PHP converte automaticamente chaves de string para inteiros se elas parecerem números. ['0' => 'a', '1' => 'b'] é, na verdade, um array sequencial, mas nossa função pode dar um resultado inesperado devido à comparação estrita (===).

\n\n

Conclusão: essa abordagem funciona, mas apenas se você tiver certeza sobre os tipos das chaves. Para produção, é melhor usar métodos mais robustos.

\n\n

Erro nº 2: Verificar apenas a primeira chave

\n\n

Alguns desenvolvedores pensam: "Se a primeira chave for 0, o array é sequencial." Isso é um equívoco perigoso.

\n\n
function isSequentialByFirstKey($arr) {\n    if (empty($arr)) return true;\n    return array_key_first($arr) === 0;\n}\n\n$bad = [0 => 'a', 'nome' => 'João'];\nvar_dump(isSequentialByFirstKey($bad)); // true — mas deveria ser false!\n
\n\n

A primeira chave é 0, mas o array é claramente associativo. Essa verificação deixaria passar arrays mistos, que são comuns em projetos reais.

\n\n

Conclusão: nunca julgue um array pelo primeiro elemento. Verifique todas as chaves.

\n\n

Erro nº 3: Ignorar arrays vazios

\n\n

Um array vazio [] é simultaneamente sequencial e associativo? Do ponto de vista do PHP, sim. Mas algumas funções falham nesse caso.

\n\n
function isAssociative($arr) {\n    return count(array_filter(array_keys($arr), 'is_string')) > 0;\n}\n\nvar_dump(isAssociative([])); // false — array vazio não é associativo\nvar_dump(isAssociative([1, 2, 3])); // false — correto\n
\n\n

Parece lógico, mas se você espera que a função retorne true para um array vazio (como se fosse associativo), está enganado. Um array vazio é um caso especial.

Blogs

Book Recommendations