in_array()
Aprenda como a função in_array() do PHP verifica se um valor existe em um array, como funciona a comparação frouxa vs. estrita e as armadilhas de tipos a evitar.
O que in_array() faz
in_array() verifica se um determinado valor existe em algum lugar de um array e retorna um boolean: true se o valor for encontrado, false caso contrário. Ela pesquisa os valores do array (não as chaves), o que a torna a função ideal para perguntas como "essa opção é permitida?" ou "esse usuário já foi adicionado à lista?".
Esta página aborda a assinatura da função, como a comparação frouxa vs. estrita altera o resultado, as armadilhas de manipulação de tipos que confundem as pessoas e quando usar uma função diferente.
Sintaxe
in_array(mixed $needle, array $haystack, bool $strict = false): bool| Parâmetro | Descrição |
|---|---|
$needle | O valor a ser procurado. |
$haystack | O array em que se realiza a busca. |
$strict | Quando true, os tipos também devem corresponder (usa === em vez de ==). O padrão é false. |
A função retorna true se $needle for encontrado em $haystack, caso contrário false.
Exemplo básico
<?php
$fruits = ["apple", "banana", "orange"];
if (in_array("banana", $fruits)) {
echo "Found!";
} else {
echo "Not found.";
}
// Output: Found!in_array() é sensível a maiúsculas e minúsculas para strings — "Apple" não corresponderia a "apple":
Comparação frouxa vs. estrita
Por padrão, in_array() usa comparação frouxa (==), portanto valores de tipos diferentes podem corresponder. Passe true como terceiro argumento para exigir correspondência exata de tipo (===):
<?php
$numbers = [1, 2, 3, 4];
// Loose: the string "1" equals the integer 1
var_dump(in_array("1", $numbers)); // bool(true)
// Strict: "1" (string) is not identical to 1 (int)
var_dump(in_array("1", $numbers, true)); // bool(false)Use o modo estrito sempre que seu array misturar tipos, ou quando corresponder ao tipo errado seria um bug — por exemplo, ao verificar um ID fornecido pelo usuário em relação a uma lista de IDs inteiros.
A armadilha de manipulação de tipos
A comparação frouxa pode produzir resultados surpreendentes. Um exemplo clássico pesquisa uma string vazia ou 0 em uma lista de strings:
<?php
$values = [0, "", "foo", "bar"];
var_dump(in_array("0", $values)); // bool(true) — "0" == 0
var_dump(in_array("0", $values, true)); // bool(false) — different typesAqui, "0" (string) é frouxamente igual ao inteiro 0 já presente no array, portanto a busca frouxa retorna true. O modo estrito elimina a ambiguidade.
Nota: O PHP 8 alterou a forma como strings e números são comparados. No PHP 7,
in_array(0, ["foo", "bar"])retornavatrueporque"foo"era convertido para0. No PHP 8+, a mesma chamada retornafalse. Em caso de dúvida, passe$strict = true.
Obtendo a posição em vez de true/false
in_array() apenas indica se um valor existe. Se você também precisar da sua chave, use array_search() — ela retorna a chave em caso de sucesso e false em caso de falha:
<?php
$fruits = ["apple", "banana", "orange"];
$key = array_search("banana", $fruits);
var_dump($key); // int(1)Para verificar se uma chave específica (não um valor) existe, use array_key_exists() ou isset().
Quando usar uma função diferente
- Precisa da posição do valor correspondente? →
array_search() - Verificando uma chave em vez de um valor? →
array_key_exists()ouisset() - Filtrando um array para elementos correspondentes? →
array_filter() - Pesquisando um array muito grande repetidamente? Inverta-o para chaves com
array_keys()e useisset(), que é mais rápido do que percorrer comin_array().
Resumo
in_array($needle, $haystack)retornatrue/falseindicando se um valor existe em um array.- Ela pesquisa valores, é sensível a maiúsculas e minúsculas para strings e usa comparação frouxa por padrão.
- Passe
truecomo terceiro argumento para correspondência estrita (sensível ao tipo) — preferido quando os tipos importam. - Use
array_search()quando precisar da chave, earray_key_exists()/isset()ao verificar chaves.