Питання PHP: видалити елемент з масиву


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

Я думав, що налаштувавши це null це зробить, але очевидно це не спрацьовує.


1972
2017-12-15 20:28


походження


Я б не сказав, що відповідь Конрада є найпростішою з викладеної проблеми. З unset() ітерації над масивом більше не включають видалене значення. ОТОХ, це правда, що відповіді Стевана достатньо, і насправді це була відповідь, яку я шукав - але не ОП :) - brandizzi
@danip Бути легко знайти в посібнику не виключає питання про StackOverflow. Якщо питання було дубльований StackOverflow питання, то це може не належати тут. StackOverflow - це хороше місце для пошуку відповідей як варіант переходу до перегляду навіть в посібнику. - Dan Nissenbaum
@nset ($ array [$ key]); $ array = array_values ​​($ array); - trojan
Пов'язане запитання про видалення цього в циклі foreach: stackoverflow.com/questions/1949259/... - Legolas
Якщо ви хочете видалити ключі з масиву масиву (асоціативний масив), див. Рішення на stackoverflow.com/a/47978980/1045444 - Somnath Muluk


Відповіді:


Існує різні способи видалення елемента масиву, де деякі з них більш корисні для деяких завдань, ніж інші.

Видалити один елемент масиву

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


2229
2017-12-15 21:25



якщо у вас є <? php $ x = масив (1, 2, 3, 4); unset ($ x [2]); var_dump ($ x); // масив (3) {[0] => int (0), [1] => int (2), [3] => int (4),}?> - Alexandru Rada
@AlexandruRada Ні, ви сказали, "не використовуйте це" - і це просто дурниця. Ви можете спокійно використовувати цей метод, коли ви розглядаєте масив як те, що це - словник. Тільки якщо ви очікуєте послідовних числових індексів, вам потрібно використовувати щось інше. - Konrad Rudolph
@Alexander Використовуйте array_splice, як описано в інших відповідях. - Konrad Rudolph
@AlexandruRada У вас немає способу array (3) { [0]=>int(0) ... коли ти unset($x[2]) від $x = array(1, 2, 3, 4); Результат повинен Бути var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } (це, ймовірно, помилка) - inemanja
array_filter також є життєздатним методом. Особливо добре, якщо ви не бажаєте змінювати масив, але він також не переіндексувати, що може стати проблемою з json_encode. php.net/manual/en/function.json-encode.php#94157 - dotnetCarpenter


Слід зазначити, що unset() буде тримати індекси недоторканими, це те, що ви очікуєте при використанні рядкових індексів (масив як хешtabl), але може бути досить дивним у роботі з цілими індексами масивами:

$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)
} */

1302
2017-08-02 15:57



Варто зазначити, що, коли ви використовуєте array_splice (), вам слід знати OFFSET, а не ключ, а зміщення (!) Будь-якого елемента, який ви хочете видалити. - Tom
@Tom: для регулярного масиву (тобто постійно індексується цілим числом), зміщення є індексом. Ось де array_splice може мати сенс (серед інших). - Stefan Gehrig
Так, звичайно, але просто щось запам'ятати, якщо ви втручаєтеся в масив, перш ніж використовувати сплайс - Tom
Від простого базового тесту видалення тони елементів з гігантського масиву, array_splice виглядає набагато швидше і менш інтенсивним для пам'яті. Це збігається з тим, що я очікував би: array_values ​​(), здається, робить копію масиву, тоді як array_splice працює на місці. - Doug Kavendek
array_values ​​є корисним підходом, коли ви видаляєте елементи в циклі та бажаєте, щоб індекси були послідовні, але потім хочете стиснути їх після циклу. - Rorrik


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

321
2017-11-15 11:29





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

176
2017-12-15 20:31



Було б добре пояснити, що ця відповідь полягає у видаленні елемента, коли ви знаєте значення, але не ключ. Зауважте, що він тільки видаляє FIRST екземпляр значення; знайти все ключі для значення, використання array_keys - ToolmakerSteve


unset($array[$index]);

58
2017-11-26 08:25





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


55
2017-07-31 01:06





Крім того, для імені елемента:

unset($array["elementName"]);


48
2017-07-19 15:37



$a = array("A"=>1, "B"=>2, "C"=>"a");  print_r($a);  unset($a["B"]);  print_r($a);  дає (відформатований): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a ) - DefenestrationDay
Здається, що ви не можете відключити елементи масиву, проіндексовані рядком (генерує "Фатальна помилка: неможливо скинути рядки зсуву"). Я не думаю, що це завжди так, але, звичайно, з PHP 5.3.10 і, можливо, раніше - carpii
@carpii PHP може скинути елементи з асоціативного масиву. Фатальна помилка виникає при спробі використання unset ($ var ['key']) на рядок, а не масив. Наприклад: $ array = array ('test' => 'value', 'another' => ' значення ',); unset ($ array ['test']); // Видаляє елемент "test" з масиву, як очікується $ array = 'test'; unset ($ array ['test']); // Викидає "Фатальна помилка: неможливо скинути рядкові зсуви", як очікувалося - Jimbo