Чи існує простий спосіб видалити елемент з масиву за допомогою 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()
для отримання всіх ключів для певного значення, а потім видалити всі елементи.
Слід зазначити, що 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)
} */