La funzione array_find()
è una delle novità più interessanti di PHP 8.4, major release del linguaggio che dovrebbe esordire a novembre 2024. Ad essa si affiancano le funzioni array_find_key()
, array_any()
e array_all()
che possono essere descritte come dei costrutti complementari o varianti di array_find()
. Di questi ultimi di occuperemo a breve, prima concentriamoci su array_find()
che è stata introdotta per colmare un vuoto presente nella gestione degli array di PHP.
Cos'è array_find()
Fino alla release 8.4 il linguaggio, pur integrando diverse funzioni native per processare gli array utilizzando i callback, non ne presentava una che permettesse di individuare un elemento in grado di corrispondere ad una condizione specifica. Realizzare una funzione personalizzata per questo scopo non è particolarmente complicato, la mancanza di una soluzione nativa ha reso però PHP meno completo rispetto a linguaggi come JavaScript, C++ o Rust che, invece, presentano da tempo dei costrutti di default con cui rilevare facilmente corrispondenze negli array.
array_find()
risolve proprio questo problema: dato un array individua il valore del primo elemento per il quale il callback restituisce TRUE
. In mancanza di una corrispondenza restituisce invece NULL
. Prima di proseguire chiariamo che, non soltanto in PHP, un callback è una funzione che può essere passata come argomento ad un'altra funzione. I callback possono essere utilizzati per personalizzare il comportamento di una funzione o per eseguire del codice in risposta a determinati eventi.
In sostanza la funzione accetta come parametri un array e un callback. Dati questi argomenti è in grado di rilevare soltanto il primo elemento per il quale esiste una corrispondenza. Questo chiarimento è importante in quanto intuitivamente sarebbe stato più logico chiamare la funzione array_first()
, come in Laravel dove abbiamo Collection::first()
. Ci si aspetterebbe infatti che una funzione chiamata in questo modo permetta di individuare tutti gli elementi di un array in grado di soddisfare la condizione data dal callback.
Le ragioni di questa scelta vanno ricercate nella volontà di offrire dei nomi simili a quelli già adottati in altri linguaggi come Rust e JavaScript. In ogni caso è sempre possibile utilizzare la funzione array_filter()
, introdotta addirittura con PHP 4.x, che permette appunto di filtrare gli elementi di un array utilizzando callback.
Come utilizzare array_find() in PHP
Per capire come funziona array_find()
a livello pratico possiamo analizzare un esempio come quello proposto di seguito:
$simpson = [
'a' => 'apu',
'b' => 'ned',
'c' => 'boe',
'd' => 'bart',
'e' => 'homer',
'f' => 'montgomery'
];
// Trova il primo nome più lungo di 4 caratteri
var_dump(array_find($simpson, function (string $v) {
return strlen($v) > 4;
})); // string(5) "Homer"
Il funzionamento dello script precedente è abbastanza semplice: viene definito un array composto da sei elementi, fatto questo l'array viene passato come primo argomento ad array_find()
il cui secondo parametro è una funzione che, a sua volta, richiama la funzione strlen()
. Quest'ultima verifica la lunghezza di ciascun elemento dell'array, che sono tutti delle stringhe, e permette di individuare quello che soddisfa la condizione posta dal callback: trovare il primo elemento il cui nome sia più lungo di quattro caratteri. Dato che homer
, il quinto elemento dell'array, soddisfa per primo tale condizione, var_dump()
stamperà:
string(5) "Homer"
Se invece volessimo trovare il primo elemento che inizia con la lettera b
dovremmo scrivere:
$simpson = [
'a' => 'apu',
'b' => 'ned',
'c' => 'boe',
'd' => 'bart',
'e' => 'homer',
'f' => 'montgomery'
];
// Trova il primo nome che inizia con la lettera b
var_dump(array_find($simpson, function (string $v) {
return str_starts_with($v), 'b');
})); // string(3) "boe"
Nell'array, infatti, abbiamo due elementi che iniziano con b
, boe
e bart
, ma array_find()
restituisce soltanto boe
, che è il terzo elemento dell'array, in quanto soddisfa per primo la condizione posta dal callback.
Se avessimo posto la condizione di restituire il primo elemento che inizia, ad esempio, con la lettera z
, la funzione avrebbe restituito NULL
perché la condizione non sarebbe stata soddisfatta.
La funzione array_find_key()
array_find_key()
, anch'essa una novità, funziona in modo simile ad array_find()
ma con una particolarità: non restituisce infatti un valore ma una chiave. In sostanza individua la chiave del valore che soddisfa per primo la condizione posta dal callback. Anche in questo caso, in assenza di una corrispondenza viene restituito NULL
. Ecco un semplice esempio del suo funzionamento:
$simpson = [
'a' => 'apu',
'b' => 'ned',
'c' => 'boe',
'd' => 'bart',
'e' => 'homer',
'f' => 'montgomery'
];
// Trova il primo nome più lungo di 3 caratteri
var_dump(array_find_key($simpson, function (string $v) {
return strlen($v) > 3;
})); // string(1) "d"
Dato che il primo nome composto da più di tre caratteri è bart
, e che nell'array esso è associato alla chiave d
, la funzione restituirà quest'ultimo.
Utilizzare array_any() in PHP
La funzione array_any()
si differenzia dalle due precedenti in quanto restituisce TRUE
se anche il callback restituisce TRUE
per un qualsiasi elemento presente in un array. Diversamente restituisce FALSE
, non NULL
. In sostanza viene restituito TRUE
se almeno un elemento soddisfa la corrispondenza proposta dal callback.
Riprendiamo quindi il nostro esempio e modifichiamolo in questo modo:
$simpson = [
'a' => 'apu',
'b' => 'ned',
'c' => 'boe',
'd' => 'bart',
'e' => 'homer',
'f' => 'montgomery'
];
// Trova almeno un elemento più lungo di 6 caratteri
var_dump(array_any($simpson, function (string $v) {
return strlen($v) > 6;
}));
Il risultato dell'esecuzione di questo script sarà il seguente:
bool(true)
in quanto abbiamo il valore montgomery
che è in grado di soddisfare la condizione proposta.
Ed infine, la funzione array_all()
L'ultima novità di questa carrellata è array_all()
, funzione che restituisce TRUE
quando il callback restituisce TRUE
per tutti gli elementi di un array passato come argomento. Se la condizione non viene soddisfatta l'esito della funzione è FALSE
. Riproponiamo per l'ultima volta l'esempio presentato in precedenza modificandolo in questo modo:
$simpson = [
'a' => 'apu',
'b' => 'ned',
'c' => 'boe',
'd' => 'bart',
'e' => 'homer',
'f' => 'montgomery'
];
// Verifica che tutti i valori siano più brevi di 15 caratteri
var_dump(array_all($simpson, function (string $v) {
return strlen($v) < 15;
}));
Dopo aver controllato la lunghezza di tutti gli elementi dell'array, l'esecuzione dello script restituirà:
bool(true)
Questo perché nessuno degli elementi misurati da strlen()
è più lungo di 15 caratteri. O per meglio dire, che è la stessa cosa, tutti gli elementi contano meno di 15 caratteri.
Conclusioni
array_find()
e le sue varianti, che saranno disponibili con il rilascio di PHP 8.4, colma alcune lacune del linguaggio. Permettendo di manipolare gli array alla ricerca di corrispondenze con le condizioni poste da un callback.