Er det en enkel måte å slette et element fra en matrise ved hjelp av PHP, slik at foreach ($array)
ikke lenger inkluderer det elementet?
Jeg trodde at å sette den til null
ville gjøre det, men tilsynelatende fungerer det ikke.
Det er forskjellige måter å slette et matriseelement på, der noen er mer nyttige for noen spesifikke oppgaver enn andre.
Hvis du vil slette bare ett matriseelement, kan du bruke \unset()
eller alternativt \array_splice()
.
Også hvis du har verdien og ikke kjenner nøkkelen for å slette elementet, kan du bruke \array_search()
for å få nøkkelen.
\unset()
-metodenMerk at når du bruker \unset()
vil ikke array-nøklene endres/reindekseres. Hvis du vil reindeksere nøklene, kan du bruke \array_values()
etter \unset()
som vil konvertere alle nøklene til numeriske oppregnede nøkler som starter fra 0.
Kode
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
Output
[
[0] => a
[2] => c
]
\array_splice()
methodHvis du bruker \array_splice()
blir nøklene automatisk reindeksert, men de assosiative nøklene endres ikke i motsetning til \array_values()
som konverterer alle nøklene til numeriske nøkler.
Også \array_splice()
trenger forskyvningen, ikke nøkkelen! som den andre parameteren.
Kode
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
Produksjon
[
[0] => a
[1] => c
]
array_splice()
samme som \unset()
tar arrayet som referanse, og dette betyr at du ikke vil tilordne returverdiene til disse funksjonene tilbake til arrayet.
Hvis du vil slette flere matriseelementer og ikke vil kalle \unset()
eller \array_splice()
flere ganger, kan du bruke funksjonene \array_diff()
eller \array_diff_key()
avhengig av om du kjenner verdiene eller nøklene til elementene du vil slette.
\array_diff()
metodenHvis du kjenner verdiene til matriseelementene du vil slette, kan du bruke \array_diff()
. Som før med \unset()
vil det ikke endre / indeksere nøklene til arrayet.
Kode
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
Produksjon
[
[1] => b
]
\array_diff_key()
metodeHvis du kjenner nøklene til elementene du vil slette, vil du bruke \array_diff_key()
. Her må du sørge for at du sender nøklene som nøkler i den andre parameteren og ikke som verdier. Ellers må du snu matrisen med \array_flip()
. Og også her vil ikke nøklene endres / indekseres.
Kode
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
Produksjon
[
[1] => b
]
Hvis du vil bruke \unset()
eller \array_splice()
for å slette flere elementer med samme verdi, kan du også bruke \array_keys()
for å få alle nøklene for en bestemt verdi og deretter slette alle elementene.
Det bør bemerkes at unset()
vil holde indekser urørt, noe som er hva du' d forventer når du bruker strengindekser (array som hashtable), men kan være ganske overraskende når du arbeider med heltallsindekserte matriser:
$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)
} */
Så array_splice()
kan brukes hvis du vil normalisere heltallsnøklene dine. Et annet alternativ er å bruke array_values()
etter 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)
} */