Удаление элемента из массива в PHP

Есть ли простой способ удалить элемент из массива с помощью PHP, чтобы foreach ($array) больше не включал этот элемент?

Я думал, что установка его на null сделает это, но, очевидно, это не работает.

2303
задан dreftymac 30 July 2019 в 04:29
поделиться

3 ответа

Существуют различные способы удалить элемент массива, где некоторые более полезны для некоторых определенных задач, чем другие.

Удаляют один элемент массива

, Если Вы хотите удалить всего один элемент массива, можно использовать \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(), ключи будут автоматически повторно индексированы, но ассоциативные ключи не изменятся в противоположность [1 117], который преобразует все ключи к числовым ключам.

Также \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() то же как [1 120] берет массив ссылкой, и это означает, что Вы не хотите присваивать возвращаемые значения тех функций назад к массиву.

Удаляют несколько элементов массива

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

\array_diff() метод

, Если Вы знаете значения элементов массива, которые Вы хотите удалить, затем можно использовать \array_diff(). Как прежде с [1 127] это не изменится/повторно индексирует ключи массива.

Код

<?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(). Здесь необходимо удостовериться, что Вы передаете ключи как ключи во втором параметре и не как значения. Иначе необходимо отразить массив с [1 142] \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() , чтобы получить все ключи для определенного значения и затем удалить все элементы.

2662
ответ дан 11 revs, 8 users 54% 30 July 2019 в 14:29
поделиться
unset($array[$index]);
76
ответ дан Eran Galperin 30 July 2019 в 14:29
поделиться

Нужно отметить, что 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)
} */
1340
ответ дан Ry- 30 July 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: