Elementa dzēšana no PHP masīva

Vai ir vienkāršs veids, kā, izmantojot PHP, dzēst elementu no masīva tā, lai foreach ($array) vairs neietvertu šo elementu?

Es domāju, ka to izdarītu, iestatot to uz null, bet acīmredzot tas nedarbojas.

Risinājums

Ir dažādi veidi, kā dzēst masīva elementu, un daži no tiem ir noderīgāki dažiem specifiskiem uzdevumiem nekā citi.

Izdzēst vienu masīva elementu

Ja vēlaties izdzēst tikai vienu masīva elementu, varat izmantot \unset() vai \array_splice().

Arī tad, ja jums ir vērtība, bet nezināt atslēgu elementa dzēšanai, varat izmantot \array_search(), lai iegūtu atslēgu.

{\unset() metode

Ņemiet vērā, ka, izmantojot \unset(), masīva atslēgas nemainīsies/nereindeksēsies. Ja vēlaties atslēgas pārindeksēt, pēc \unset() varat izmantot \array_values(), kas visas atslēgas pārveidos skaitliskās uzskaitītās atslēgās, sākot no 0.

Kods

<?php

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

?>

Izvades

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

\array_splice() metode

Izmantojot \array_splice(), atslēgas tiks automātiski pārindeksētas, bet asociatīvās atslēgas nemainīsies, atšķirībā no \array_values(), kas visas atslēgas konvertēs uz skaitliskajām atslēgām.

Arī \array_splice() kā otrais parametrs ir nepieciešams nobīde, nevis atslēga.

Kods

<?php

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

?>

Izvades

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

array_splice() tāpat kā \unset() ņem masīvu pēc atsauces, un tas nozīmē, ka šo funkciju atgrieztās vērtības nevēlaties piešķirt atpakaļ masīvam.

Izdzēst vairākus masīva elementus

Ja vēlaties dzēst vairākus masīva elementus un nevēlaties vairākas reizes izsaukt \unset() vai \array_splice(), varat izmantot funkcijas \array_diff() vai \array_diff_key() atkarībā no tā, vai jūs zināt to elementu vērtības vai atslēgas, kurus vēlaties dzēst.

\array_diff() metode

Ja jums ir zināmas to masīva elementu vērtības, kurus vēlaties dzēst, varat izmantot \array_diff(). Tāpat kā iepriekš ar \unset() tā nemainīs/neindeksēs masīva atslēgas.

Kods

<?php

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

?>

Izvades

[
    [1] => b
]

\array_diff_key() metode

Ja jūs zināt elementu, kurus vēlaties dzēst, atslēgas, tad jūs vēlaties izmantot \array_diff_key(). Šajā gadījumā jums ir jāpārliecinās, ka otrajā parametrā atslēgas tiek nodotas kā atslēgas, nevis kā vērtības. Pretējā gadījumā masīvs ir jāpārvērš, izmantojot \array_flip(). Un arī šeit atslēgas nemainīsies/nereindeksēsies.

Kods

<?php

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

Izvades

[
    [1] => b
]

Ja vēlaties izmantot \unset() vai \array_splice(), lai dzēstu vairākus elementus ar vienu un to pašu vērtību, varat izmantot \array_keys(), lai iegūtu visus atslēgas atslēgas konkrētai vērtībai un pēc tam dzēstu visus elementus.

Komentāri (9)

Jāatzīmē, ka unset() saglabās indeksus neskartus, kas ir tas, ko varētu sagaidīt, ja tiek izmantoti virknes indeksi (masīvs kā hashtable), bet var būt diezgan pārsteidzoši, ja tiek izmantoti veselu skaitļu indeksēti masīvi:

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

Tātad array_splice() var izmantot, ja vēlaties normalizēt veselu skaitļu atslēgas. Vēl viena iespēja ir izmantot array_values() pēc 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)
} */
Komentāri (8)
unset($array[$index]);
Komentāri (0)