Удаление элемента из массива в PHP - PullRequest
2250 голосов
/ 15 декабря 2008

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

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

Ответы [ 38 ]

2566 голосов
/ 15 декабря 2008

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

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

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

1330 голосов
/ 16 декабря 2008

Следует отметить, что 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)
} */
349 голосов
/ 02 августа 2011
  // Our initial array
  $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
  print_r($arr);

  // Remove the elements who's values are yellow or red
  $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);

Это вывод из кода выше:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

Теперь array_values ​​() будет красиво переиндексировать числовой массив, но удалит все ключевые строки из массива и заменит их числами. Если вам нужно сохранить имена ключей (строки) или переиндексировать массив, если все ключи числовые, используйте array_merge ():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

Выходы

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)
188 голосов
/ 15 ноября 2011
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
74 голосов
/ 15 декабря 2008
unset($array[$index]);
61 голосов
/ 26 ноября 2012

Если у вас есть числовой индексированный массив, где все значения уникальны (или они не уникальны, но вы хотите удалить все экземпляры определенного значения), вы можете просто использовать array_diff (), чтобы удалить соответствующий элемент, например, так: :

$my_array = array_diff($my_array, array('Value_to_remove'));

Например:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Отображается следующее:

4
3

В этом примере элемент со значением 'Charles' удаляется, что можно проверить с помощью вызовов sizeof (), которые сообщают о размере 4 для исходного массива и 3 после удаления.

57 голосов
/ 31 июля 2010

Также для именованного элемента:

unset($array["elementName"]);
29 голосов
/ 19 июля 2015

Уничтожить один элемент массива

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

Вывод будет:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

Если вам нужно переиндексировать массив:

$array1 = array_values($array1);
var_dump($array1);

Тогда вывод будет:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

Удаление элемента из конца массива - вернуть значение удаленного элемента

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

Вывод будет

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

Удалить первый элемент (красный) из массива , - вернуть значение удаленного элемента

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

Вывод будет:

Array
(
    [b] => green
    [c] => blue
)
First Color: red
26 голосов
/ 11 июня 2013
<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Выход:

Array
(
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
)

fruit1
25 голосов
/ 22 сентября 2016

Чтобы избежать поиска, можно поиграть с array_diff:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

В этом случае не нужно искать / использовать ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...