Видалення елементу з масиву в 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)