Изтриване на елемент от масив в PHP

Има ли лесен начин за изтриване на елемент от масив с помощта на PHP, така че foreach ($array) вече да не включва този елемент?

Мислех, че задаването на стойност null ще го направи, но очевидно не работи.

Решение

Съществуват различни начини за изтриване на елемент от масив, като някои от тях са по-полезни за някои специфични задачи, отколкото други.

Изтриване на един елемент от масив

Ако искате да изтриете само един елемент от масив, можете да използвате \unset() или алтернативно \array_splice().

Също така, ако имате стойността и не знаете ключа за изтриване на елемента, можете да използвате \array_search(), за да получите ключа.

\unset() метод

Обърнете внимание, че когато използвате \unset(), ключовете на масива няма да се променят/реиндексират. Ако искате да преиндексирате ключовете, можете да използвате \array_values() след \unset(), което ще преобразува всички ключове в числени ключове, започващи от 0.

Код

<?php

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

?>

Изход

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

\array_splice() метод

Ако използвате \array_splice(), ключовете ще бъдат автоматично преиндексирани, но асоциативните ключове няма да се променят, за разлика от \array_values(), който ще преобразува всички ключове в цифрови.

Също така \array_splice() се нуждае от отместване, а не от ключ! като втори параметър.

Код

<?php

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

?>

Изход

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

array_splice() и \unset() приемат масива като референция, а това означава, че не искате да присвоявате върнатите стойности на тези функции обратно към масива.

Изтриване на няколко елемента от масива

Ако искате да изтриете няколко елемента от масива и не искате да извиквате многократно \unset() или \array_splice(), можете да използвате функциите \array_diff() или \array_diff_key() в зависимост от това дали знаете стойностите или ключовете на елементите, които искате да изтриете.

\array_diff() метод

Ако знаете стойностите на елементите на масива, които искате да изтриете, тогава можете да използвате \array_diff(). Както и преди, при \unset() няма да се променят/преиндексират ключовете на масива.

Код

<?php

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

?>

Изход

[
    [1] => b
]

\array_diff_key() метод

Ако знаете ключовете на елементите, които искате да изтриете, тогава използвайте \array_diff_key(). Тук трябва да се уверите, че предавате ключовете като ключове във втория параметър, а не като стойности. В противен случай трябва да обърнете масива с \array_flip(). И също така тук ключовете няма да се променят/реиндексират.

Код

<?php

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

Изход

[
    [1] => b
]

Също така, ако искате да използвате \unset() или \array_splice(), за да изтриете няколко елемента с една и съща стойност, можете да използвате \array_keys(), за да получите всички ключове за определена стойност и след това да изтриете всички елементи.

Коментари (9)

Трябва да се отбележи, че unset() ще запази индексите непокътнати, което е това, което бихте очаквали, когато използвате низови индекси (масив като хештаблица), но може да бъде доста изненадващо, когато работите с масиви с целочислени индекси:

$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() може да се използва, ако искате да нормализирате целочислените си ключове. Друга възможност е да използвате array_values() след 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)
} */
Коментари (8)
unset($array[$index]);
Коментари (0)