Capire la Funzione array_shift di PHP
La funzione array_shift in PHP rimuove il primo elemento da un array e ne restituisce il valore. Scopri sintassi, re-indicizzazione ed esempi pratici.
La funzione array_shift in PHP rimuove il primo elemento da un array e ne restituisce il valore. Poiché opera sempre sull'inizio dell'array, è lo strumento naturale per consumare una lista dall'inizio — elaborare una coda, rimuovere una riga di intestazione o eliminare un elemento iniziale indesiderato.
Due caratteristiche distinguono array_shift dal semplice annullamento di $array[0]:
- Modifica l'array originale in-place (passato per riferimento) — non si costruisce un nuovo array.
- Re-indicizza le chiavi numeriche, quindi gli elementi rimanenti ricominceranno sempre da
0. Le chiavi string vengono lasciate invariate.
Questa pagina tratta la sintassi, il valore restituito, il comportamento di re-indicizzazione, un'insidia comune nei cicli e diversi esempi eseguibili.
Sintassi
array_shift(array &$array): mixed| Parte | Significato |
|---|---|
&$array | L'array da cui effettuare lo shift. Passato per riferimento, quindi viene modificato direttamente. |
| valore restituito | Il valore del primo elemento rimosso, oppure null se l'array è vuoto. |
Poiché l'array viene passato per riferimento, si chiama array_shift($colors) su una variabile — non su un letterale o sul risultato di una funzione.
Rimozione del primo elemento
L'utilizzo più comune è eliminare il primo elemento. La funzione modifica l'array direttamente:
Il risultato sarà:
Array
(
[0] => green
[1] => blue
)Acquisizione del valore rimosso
array_shift restituisce l'elemento rimosso, quindi è possibile conservarlo riducendo l'array in un'unica istruzione:
Il risultato sarà:
red
Array
(
[0] => green
[1] => blue
)Le chiavi vengono re-indicizzate
Questo è il comportamento che sorprende di più. array_shift non si limita a rimuovere $array[0] — rinumera ogni chiave intera rimanente a partire da 0. Le chiavi string mantengono i loro nomi.
<?php
$data = [5 => "a", 10 => "b", "x" => "c"];
array_shift($data); // removes "a"
print_r($data);
?>Il risultato sarà:
Array
(
[0] => b
[x] => c
)Si noti che 10 => "b" è diventato 0 => "b", mentre "x" => "c" è rimasto invariato. Se è necessario preservare le chiavi numeriche originali, usa invece array_slice.
Elaborazione di un array come coda
Un pattern comune consiste nel svuotare un array dall'inizio, elaborando un elemento alla volta. L'idioma standard usa array_shift all'interno di un ciclo while:
Il risultato sarà:
Running: build
Running: test
Running: deployIl ciclo si ferma perché array_shift restituisce null quando l'array è vuoto.
Insidia: non usare un test di valore truthy nel ciclo
Spesso si incontra questa forma più breve:
while ($value = array_shift($queue)) { ... }Funziona con string come "build", ma è una trappola. La condizione è vera solo finché il valore è truthy, quindi il ciclo si interrompe prematuramente al primo 0, "", "0", false, o null:
<?php
$numbers = array(3, 0, 1);
while ($n = array_shift($numbers)) {
echo "$n\n";
}
print_r($numbers); // 1 was never processed
?>Il risultato sarà:
3
Array
(
[0] => 1
)Il ciclo si è interrotto a 0, lasciando 1 non elaborato. Confronta sempre esplicitamente con null (!== null) quando i valori potrebbero essere falsy.
Rimozione di più elementi iniziali
Chiamando array_shift più volte si rimuovono gli elementi dall'inizio. Qui eliminiamo i primi tre:
Il risultato sarà:
Array
(
[0] => yellow
[1] => orange
)Per rimuovere un gruppo iniziale di elementi in una sola chiamata anziché in un ciclo, usa array_splice($colors, 0, 3).
Funzioni correlate
array_shift è una delle quattro funzioni per aggiungere e rimuovere elementi alle estremità di un array:
| Funzione | Agisce su | Cosa fa |
|---|---|---|
| array_shift | Inizio | Rimuove e restituisce il primo elemento |
| array_unshift | Inizio | Aggiunge uno o più elementi all'inizio |
| array_pop | Fine | Rimuove e restituisce l'ultimo elemento |
| array_push | Fine | Aggiunge uno o più elementi alla fine |
Per estrarre una porzione senza modificare l'array originale, vedi array_slice; per rimuovere o sostituire un intervallo, vedi array_splice.
Conclusione
array_shift rimuove il primo elemento di un array, ne restituisce il valore, modifica l'array in-place e re-indicizza le chiavi intere rimanenti a partire da 0. È ideale per consumare un array come coda e per eliminare elementi iniziali indesiderati — ricorda solo il comportamento di re-indicizzazione e l'insidia del ciclo con valori falsy descritti sopra.