Como verificar se um array é associativo ou sequencial em PHP: analisando os principais erros
\n\nVocê 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.
Neste artigo, vamos explorar as diferenças entre arrays associativos e sequenciais, mostrar erros comuns e fornecer soluções práticas. Vamos nessa!
\n\nO que é um array sequencial e um array associativo?
\n\nNo 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
- 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
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\nErro nº 1: Usar array_keys() e comparar com range
\n\nUma 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.
// 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\nO 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 (===).
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\nErro nº 2: Verificar apenas a primeira chave
\n\nAlguns desenvolvedores pensam: "Se a primeira chave for 0, o array é sequencial." Isso é um equívoco perigoso.
\n\nfunction 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\nA primeira chave é 0, mas o array é claramente associativo. Essa verificação deixaria passar arrays mistos, que são comuns em projetos reais.
\n\nConclusão: nunca julgue um array pelo primeiro elemento. Verifique todas as chaves.
\n\nErro nº 3: Ignorar arrays vazios
\n\nUm array vazio [] é simultaneamente sequencial e associativo? Do ponto de vista do PHP, sim. Mas algumas funções falham nesse caso.
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\nParece 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.