Вопрос: PHP: удалить элемент из массива


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

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


1942


источник


Ответы:


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

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

Если вы хотите удалить только один элемент массива, вы можете использовать unset()или альтернативный array_splice(),

Также, если у вас есть значение и не знаете ключа для удаления элемента, который вы можете использовать array_search()чтобы получить ключ.

unset()метод

Обратите внимание, что когда вы используете unset()ключи массива не изменятся / переиндексируются. Если вы хотите переиндексировать ключи, которые вы можете использовать array_values()после unset()который преобразует все ключи в числовые перечисленные ключи, начиная с 0.

Код

<?php

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

?>

Вывод

Array (
    [0] => a
    [2] => c
)

array_splice()метод

Если вы используете array_splice()ключи будут автоматически переиндексированы, но ассоциативные ключи не изменятся в противоположность array_values()который преобразует все ключи в числовые клавиши.

Также array_splice()требуется смещение, а не ключ !, как второй параметр.

Код

<?php

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

?>

Вывод

Array (
    [0] => a
    [1] => c
)

array_splice()такой же как unset()возьмите массив по ссылке, это означает, что вы не хотите назначать возвращаемые значения этих функций обратно в массив.

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

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

array_diff()метод

Если вы знаете значения элементов массива, которые вы хотите удалить, вы можете использовать array_diff(), Как и раньше, unset()он не будет изменять / переиндексировать ключи массива.

Код

<?php

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

?>

Вывод

Array (
    [1] => b
)

array_diff_key()метод

Если вы знаете ключи элементов, которые хотите удалить, то вы хотите использовать array_diff_key(), Здесь вы должны убедиться, что вы передаете ключи как ключи во втором параметре, а не как значения. В противном случае вам нужно перевернуть массив с помощью array_flip(), А также здесь ключи не изменятся / переиндексируются.

Код

<?php

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

Вывод

Array (
    [1] => b
)

Также, если вы хотите использовать unset()или array_splice()для удаления нескольких элементов с тем же значением, которое вы можете использовать array_keys()чтобы получить все ключи для определенного значения, а затем удалить все элементы.


2169



Необходимо отметить, что 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)
} */

1291



  // 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
)

315



$key = array_search($needle,$array);
if($key!==false){
    unset($array[$key]);
}

172



unset($array[$index]);

55



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

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


55



Also, for a named element:

unset($array["elementName"]);


46



Destroy a single element of an array

unset()

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

The output will be:

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

If you need to re index the array:

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

Then the output will be:

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

Pop the element off the end of array - return the value of the removed element

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

The output will be

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

Remove the first element (red) from an array, - return the value of the removed element

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);

The output will be:

Array
(
    [b] => green
    [c] => blue
)
First Color: red

24



<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Output:

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

fruit1

21