C'è un modo semplice per cancellare un elemento da un array usando PHP, in modo che foreach ($array)
non includa più quell'elemento?
Pensavo che impostarlo su null
lo avrebbe fatto, ma apparentemente non funziona.
Ci sono diversi modi per cancellare un elemento dell'array, dove alcuni sono più utili di altri per alcuni compiti specifici.
Se volete cancellare solo un elemento dell'array potete usare \unset()
o in alternativa \array_splice()
.
Inoltre se hai il valore e non conosci la chiave per cancellare l'elemento puoi usare \array_search()
per ottenere la chiave.
unset()
Si noti che quando si usa `unset()
le chiavi dell'array non cambieranno/reindicizzeranno. Se vuoi reindicizzare le chiavi puoi usare \array_values()
dopo \unset()
che convertirà tutte le chiavi in chiavi numeriche enumerate a partire da 0.
Codice
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
Uscita
[
[0] => a
[2] => c
]
\array_splice()
Se usate \array_splice()
le chiavi saranno automaticamente reindicizzate, ma le chiavi associative non cambieranno al contrario di \array_values()
che convertirà tutte le chiavi in chiavi numeriche.
Inoltre `array_splice()
ha bisogno dell'offset, non della chiave, come secondo parametro.
Codice
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
Uscita
[
[0] => a
[1] => c
]
array_splice()
così come \unset()
prendono l'array per riferimento, e questo significa che non volete assegnare i valori di ritorno di queste funzioni all'array.
Se volete cancellare più elementi di un array e non volete chiamare unset()
o \array_splice()
più volte potete usare le funzioni \array_diff()
o \array_diff_key()
a seconda che conosciate i valori o le chiavi degli elementi che volete cancellare.
\array_diff()
]7Se conoscete i valori degli elementi dell'array che volete cancellare, allora potete usare \array_diff()
. Come prima con `unset()
non cambierà/reindicizzerà le chiavi dell'array.
Codice
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
Uscita
[
[1] => b
]
Se conoscete le chiavi degli elementi che volete cancellare, allora volete usare \array_diff_key()
. Qui dovete assicurarvi di passare le chiavi come chiavi nel secondo parametro e non come valori. Altrimenti, dovete capovolgere l'array con \array_flip()
. E anche qui le chiavi non cambieranno/reindicizzeranno.
Codice
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
Uscita
[
[1] => b
]
Inoltre se vuoi usare `unset()
o \array_splice()
per cancellare più elementi con lo stesso valore puoi usare \array_keys()
per ottenere tutte le chiavi per un valore specifico e poi cancellare tutti gli elementi.
Si dovrebbe notare che unset()
manterrà gli indici intatti, che è ciò che ci si aspetta quando si usano indici di stringa (array come hashtable), ma può essere abbastanza sorprendente quando si ha a che fare con array indicizzati con interi:
$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[3]=>
int(3)
} */
$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */
Quindi array_splice()
può essere usato se volete normalizzare le vostre chiavi intere. Un'altra opzione è usare array_values()
dopo unset()
:
$array = array(0, 1, 2, 3);
unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */