array_search($value, $array) restituisce la chiave del primo elemento uguale a $value, oppure false se nessun elemento corrisponde. Dato che una chiave trovata può essere 0, verifica il risultato con !== false, come in if (($key = array_search('pear', $fruits)) !== false).
Se ti serve solo un sì o un no, in_array() lo dice direttamente. array_search() serve quando devi sapere dove si trova il valore, per esempio per modificarlo o rimuoverlo.
La trappola 0 vs false
Il bug più comune con array_search(): il valore è il primo elemento, la sua chiave è 0, e if ($key) tratta 0 come falso. Il codice dice "non trovato" per un valore che è proprio lì. Confronta con !== false, che corrisponde solo a un vero false.
!= false ha lo stesso bug di if ($key), perché 0 == false è true. Solo l'operatore stretto li distingue.
Ricerca stretta
Come in_array(), array_search() confronta con == a meno che tu non passi true come terzo argomento. La modalità debole permette a una stringa di trovare un numero e a null di trovare 0, il che restituisce una chiave inattesa.
Trovare tutte le chiavi con un valore
array_search() si ferma alla prima corrispondenza. array_keys($array, $value) restituisce ogni chiave corrispondente come array; aggiungi true per un confronto stretto. Un risultato vuoto significa nessuna corrispondenza, quindi non c'è confusione tra 0 e false.
Cercare in un array multidimensionale con array_column
array_search() non guarda dentro gli array annidati. Per una lista di righe, estrai con array_column() il campo che stai cercando; le posizioni in quella lista corrispondono ai numeri di riga, quindi il risultato è l'indice della riga.
array_column() rinumera il suo output da 0, quindi tutto torna solo quando le righe sono numerate 0, 1, 2 senza buchi. Dopo unset() o array_filter() la numerazione ha dei buchi; esegui prima array_values() sulle righe oppure usa la ricerca per chiave delle ultime due righe. array_column() approfondisce la forma con la chiave indice.
Ricerca case-insensitive
array_search() confronta le stringhe esattamente. Converti in minuscolo entrambi i lati per ignorare maiuscole e minuscole. array_map() mantiene le chiavi, quindi la chiave che ottieni è quella dell'array originale.
Cercare e poi sostituire o rimuovere
Il motivo abituale per cercare è agire sull'elemento trovato. Con la chiave in mano, assegna per modificarlo o usa unset() per rimuoverlo, e proteggiti sempre prima con !== false: unset($arr[false]) rimuove in silenzio l'elemento con chiave 0.
Domande frequenti
Cosa restituisce array_search se il valore non viene trovato?
false. Quando il valore viene trovato restituisce la sua chiave, che può essere 0 o una stringa vuota, quindi verifica il risultato con !== false, mai con if ($key) o != false.
Perché il mio controllo con array_search fallisce per il primo elemento?
Il primo elemento di un array indicizzato ha chiave 0, e 0 è falsy. if (array_search('a', ['a', 'b'])) entra quindi nel ramo di valore non trovato. Scrivi if (array_search('a', $arr) !== false).
Come trovo tutte le chiavi di un valore in PHP?
array_search() si ferma alla prima corrispondenza. array_keys($array, $value, true) restituisce ogni chiave il cui valore corrisponde, come array (vuoto quando non ce ne sono).
Come cerco in un array multidimensionale in PHP?
Estrai il campo in una lista piatta e cerca lì: $i = array_search('ada@example.com', array_column($users, 'email'));, poi leggi la riga come $users[$i]. Funziona quando le righe sono numerate 0, 1, 2; altrimenti usa un ciclo foreach.