in_array()
Scopri come in_array() di PHP verifica l'esistenza di un valore in un array, le differenze tra confronto loose e strict e gli errori di type-juggling da evitare.
Cosa fa in_array()
in_array() verifica se un determinato valore esiste in un array e restituisce un boolean: true se il valore viene trovato, false in caso contrario. Esegue la ricerca sui valori dell'array (non sulle chiavi), il che la rende la funzione ideale per domande come "questa opzione è consentita?" o "questo utente è già stato aggiunto alla lista?".
Questa pagina illustra la firma della funzione, come il confronto loose e strict influenza il risultato, gli errori di type-juggling che spesso sorprendono i programmatori, e quando conviene usare una funzione diversa.
Sintassi
in_array(mixed $needle, array $haystack, bool $strict = false): bool| Parametro | Descrizione |
|---|---|
$needle | Il valore da cercare. |
$haystack | L'array in cui eseguire la ricerca. |
$strict | Quando è true, anche i tipi devono corrispondere (usa === invece di ==). Il valore predefinito è false. |
La funzione restituisce true se $needle viene trovato in $haystack, altrimenti false.
Esempio di base
<?php
$fruits = ["apple", "banana", "orange"];
if (in_array("banana", $fruits)) {
echo "Found!";
} else {
echo "Not found.";
}
// Output: Found!in_array() è case-sensitive per le stringhe — "Apple" non corrisponde a "apple":
Confronto loose e strict
Per impostazione predefinita in_array() usa il confronto loose (==), quindi valori di tipo diverso possono corrispondere. Passa true come terzo argomento per richiedere una corrispondenza di tipo esatta (===):
<?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)Usa la modalità strict quando il tuo array mescola tipi, oppure quando una corrispondenza con il tipo sbagliato sarebbe un errore — ad esempio quando si controlla un ID fornito dall'utente rispetto a una lista di ID interi.
L'insidia del type-juggling
Il confronto loose può produrre risultati sorprendenti. Un esempio classico cerca una stringa vuota o 0 in una lista di stringhe:
<?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 typesQui "0" (stringa) è loosely uguale all'intero 0 già presente nell'array, quindi la ricerca loose restituisce true. La modalità strict elimina l'ambiguità.
Nota: PHP 8 ha cambiato il confronto tra stringhe e numeri. In PHP 7,
in_array(0, ["foo", "bar"])restituivatrueperché"foo"veniva convertito a0. In PHP 8+ la stessa chiamata restituiscefalse. In caso di dubbio, passa$strict = true.
Ottenere la posizione invece di true/false
in_array() indica solo se un valore esiste. Se hai bisogno anche della sua chiave, usa array_search() — restituisce la chiave in caso di successo e false in caso di fallimento:
<?php
$fruits = ["apple", "banana", "orange"];
$key = array_search("banana", $fruits);
var_dump($key); // int(1)Per verificare se esiste una determinata chiave (non un valore), usa invece array_key_exists() o isset().
Quando usare una funzione diversa
- Hai bisogno della posizione del valore corrispondente? →
array_search() - Stai controllando una chiave anziché un valore? →
array_key_exists()oisset() - Vuoi filtrare un array fino agli elementi corrispondenti? →
array_filter() - Stai cercando ripetutamente in un array molto grande? Convertilo in chiavi con
array_keys()e usaisset(), che è più veloce della scansione conin_array().
Riepilogo
in_array($needle, $haystack)restituiscetrue/falseper indicare se un valore esiste in un array.- Esegue la ricerca sui valori, è case-sensitive per le stringhe e usa il confronto loose per impostazione predefinita.
- Passa
truecome terzo argomento per il confronto strict (con controllo del tipo) — preferibile quando i tipi sono importanti. - Usa
array_search()quando hai bisogno della chiave, earray_key_exists()/isset()per controllare le chiavi.