PHP: Как удалить конкретный элемент из массива? - PullRequest
135 голосов
/ 15 марта 2010

Как мне удалить элемент из массива, когда я знаю имя элемента? например:

У меня есть массив:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

пользователь вводит strawberry

strawberry удалено.

Для полного объяснения:

У меня есть база данных, в которой хранится список элементов, разделенных запятой. Код извлекается из списка на основе выбора пользователя, где находится этот выбор. Таким образом, если они выбирают «клубнику», они извлекают код в каждой записи, где находится «клубника», а затем преобразуют ее в массив с помощью split (). Я хочу, чтобы они удалили выбранные пользователем элементы, например, для клубники, из массива.

Ответы [ 20 ]

260 голосов
/ 15 марта 2010

Используйте array_search, чтобы получить ключ и удалить его с помощью unset, если найдено:

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

array_search возвращает false ( null до PHP 4.2.0), если элемент не был найден.

И если может быть несколько предметов с одинаковым значением, вы можете использовать array_keys, чтобы получить ключи ко всем предметам:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
124 голосов
/ 17 сентября 2013

Используйте array_diff() для решения на 1 строку:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Нет необходимости в дополнительных функциях или цикле foreach.

35 голосов
/ 15 марта 2010
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
19 голосов
/ 20 февраля 2014

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

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) только удаляет элемент, но не переупорядочивает обычный массив.

Предположим, у нас есть массив и мы используем array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

По сравнению с unset:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Обратите внимание, как unset($array[$key]) не меняет порядок массива.

7 голосов
/ 20 февраля 2013

$arr = \array_filter($arr, function ($v) { return $v != 'some_value'; }

4 голосов
/ 28 января 2015

Это простое повторение, которое может удалить несколько значений в массиве.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
3 голосов
/ 30 октября 2014

Я сейчас использую эту функцию:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Вы можете ввести массив или только строку с элементами, которые должны быть удалены. Напишите это так:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

OR

$detils = array_delete('orange', $detils);

Он также будет переиндексировать.

2 голосов
/ 15 марта 2010

Будет так:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
1 голос
/ 25 мая 2018

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

Вернусь к примеру:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

или

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Если вы напечатаете результат, вы получите:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Результат:

> apple
> orange
> blueberry
> kiwi

Но индексы будут сохранены, и вы получите доступ к своему элементу, например:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

И поэтому окончательный массив не переиндексируется. Так что вам нужно добавить после unset или array_diff:

$array_without_strawberries = array_values($array);

После этого ваш массив будет иметь нормальный индекс:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Похожие по теме: Re-Index Array

enter image description here

Надеюсь, это поможет

1 голос
/ 05 октября 2017

Ответ на PHP массив удалить по значению (не ключу) Дано https://stackoverflow.com/users/924109/rok-kralj

ИМО - лучший ответ, поскольку он удаляет и не мутирует

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Это хорошо обобщает, вы можете удалить столько элементов, сколько хотите одновременно, если хотите.

Отказ от ответственности: обратите внимание, что мое решение создает новую копию массива, сохраняя при этом старый без изменений в отличие от принятого ответа, который изменяется. Это может быть немного медленнее из-за этого.

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