Elementin poistaminen joukosta PHP:ssä

Onko olemassa helppo tapa poistaa elementti matriisista PHP:n avulla siten, että foreach ($array) ei enää sisällä kyseistä elementtiä?

Luulin, että sen asettaminen arvoon null auttaisi, mutta ilmeisesti se ei toimi.

Ratkaisu

Joukkoelementin poistamiseen on erilaisia tapoja, joista toiset ovat hyödyllisempiä joihinkin erityistehtäviin kuin toiset.

Poista yksi array-elementti

Jos haluat poistaa vain yhden array-elementin, voit käyttää \unset() tai vaihtoehtoisesti \array_splice().

Jos sinulla on arvo, mutta et tiedä avainta, jolla elementti poistetaan, voit käyttää \array_search() saadaksesi avaimen.

\unset() menetelmä

Huomaa, että kun käytät \unset() -menetelmää, matriisin avaimet eivät muutu/reindeksi muutu. Jos haluat indeksoida avaimet uudelleen, voit käyttää \array_values() \unset():n jälkeen, mikä muuttaa kaikki avaimet numeerisiksi luetelluiksi avaimiksi alkaen 0:sta.

Koodi

<?php

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

?>

Tulos

[
    [0] => a
    [2] => c
]

\array_splice() menetelmä

Jos käytät \array_splice() -menetelmää, avaimet indeksoidaan automaattisesti uudelleen, mutta assosiatiiviset avaimet eivät muutu toisin kuin \array_values() -menetelmässä, joka muuntaa kaikki avaimet numeerisiksi avaimiksi.

Lisäksi \array_splice() tarvitsee toisena parametrina offsetin, ei avainta!.

Koodi

<?php

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

?>

Tulos

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

array_splice() samoin kuin \unset() ottavat matriisin viitteenä, ja tämä tarkoittaa, että näiden funktioiden palautusarvoja ei haluta antaa takaisin matriisiin.

Poista useita array-elementtejä

Jos haluat poistaa useampia array-elementtejä etkä halua kutsua \unset() tai \array_splice() useita kertoja, voit käyttää funktioita \array_diff() tai \array_diff_key() riippuen siitä, tiedätkö niiden elementtien arvot vai avaimet, jotka haluat poistaa.

\array_diff() menetelmä

Jos tiedät niiden array-elementtien arvot, jotka haluat poistaa, voit käyttää \array_diff() -menetelmää. Kuten aiemmin \unset():n kanssa, se ei muuta/reindeksiä matriisin avaimia.

Koodi

<?php

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

?>

Tulos

[
    [1] => b
]

\array_diff_key() menetelmä

Jos tiedät niiden elementtien avaimet, jotka haluat poistaa, kannattaa käyttää \array_diff_key(). Tässä tapauksessa sinun on varmistettava, että annat avaimet avaimina toisessa parametrissa, etkä arvoina. Muussa tapauksessa joudut kääntämään arraya \array_flip():llä. Ja tässäkään tapauksessa avaimet eivät muutu/reindikoidu.

Koodi

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                    //↑           ↑ Array keys which you want to delete
?>

Tulos

[
    [1] => b
]

Jos haluat käyttää \unset() tai \array_splice() poistamaan useita elementtejä, joilla on sama arvo, voit käyttää \array_keys() saadaksesi kaikki tietyn arvon avaimet ja poistaaksesi sitten kaikki elementit.

Kommentit (9)

On huomattava, että unset() pitää indeksit koskemattomina, mitä odottaisi, kun käytetään merkkijonoindeksejä (array as hashtable), mutta se voi olla melko yllättävää, kun käsitellään kokonaislukuindeksoituja matriiseja:

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

Joten array_splice() voidaan käyttää, jos haluat normalisoida kokonaislukuavaimet. Toinen vaihtoehto on käyttää array_values() unset() jälkeen:

$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)
} */
Kommentit (8)
unset($array[$index]);
Kommentit (0)