Sletning af et element fra et array i PHP

Er der en nem måde at slette et element fra et array med PHP, således at foreach ($array) ikke længere indeholder dette element?

Jeg troede, at det ville gøre det, hvis man satte det til null, men det virker åbenbart ikke.

Løsning

Der er forskellige måder at slette et array-element på, og nogle er mere nyttige til nogle specifikke opgaver end andre.

Slet et array-element

Hvis du ønsker at slette kun ét arrayelement kan du bruge \unset() eller alternativt \array_splice().

Hvis du har værdien og ikke kender nøglen til at slette elementet, kan du også bruge \array_search() for at få nøglen.

\unset() metode

Bemærk, at når du bruger \unset(), vil array-nøglerne ikke ændres/reindexeres. Hvis du ønsker at reindeksere nøglerne, kan du bruge \array_values() efter \unset(), som vil konvertere alle nøgler til numeriske enumererede nøgler startende 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() metode

Hvis du bruger \array_splice() vil nøglerne automatisk blive reindexeret, men de associative nøgler vil ikke ændre sig i modsætning til \array_values(), som vil konvertere alle nøgler til numeriske nøgler.

Desuden har \array_splice() brug for offset, ikke nøglen! som den anden parameter.

Kode

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \array_splice($array, 1, 1);
                        //↑ Offset which you want to delete

?>

Output

[
    [0] => a
    [1] => c
]

array_splice() og \unset() tager arrayet som reference, og det betyder, at du ikke ønsker at tildele returværdierne af disse funktioner tilbage til arrayet.

Slet flere array-elementer

Hvis du ønsker at slette flere array-elementer og ikke ønsker at kalde \unset() eller \array_splice() flere gange, kan du bruge funktionerne \array_diff() eller \array_diff_key(), afhængigt af om du kender værdierne eller nøglerne for de elementer, som du ønsker at slette.

\array_diff() metode

Hvis du kender værdierne af de array-elementer, som du vil slette, kan du bruge \array_diff(). Som før med \unset() vil det ikke ændre/reindexere nøglerne i arrayet.

Kode

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff($array, ["a", "c"]);
                               //└────────┘→ Array values which you want to delete

?>

Output

[
    [1] => b
]

\array_diff_key() metode

Hvis du kender nøglerne til de elementer, som du vil slette, skal du bruge \array_diff_key(). Her skal du sikre dig, at du overgiver nøglerne som nøgler i den anden parameter og ikke som værdier. Ellers skal du vende arrayet med \array_flip(). Og også her vil nøglerne ikke ændres/reindexeres.

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
?>

Output

[
    [1] => b
]

Hvis du også ønsker at bruge \unset() eller \array_splice() til at slette flere elementer med samme værdi, kan du bruge \array_keys() til at hente alle nøglerne for en bestemt værdi og derefter slette alle elementer.

Kommentarer (9)

Det skal bemærkes, at unset() bevarer indeksene uberørt, hvilket er hvad man forventer, når man bruger string-indekser (array som hashtable), men kan være ret overraskende, når man har med heltalsindekserede arrays at gøre:

$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)
} */

array_splice() kan bruges, hvis du gerne vil normalisere dine heltalsnøgler. En anden mulighed er at bruge array_values() efter 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)
} */
Kommentarer (8)
unset($array[$index]);
Kommentarer (0)