PHP: Как удалить определенный элемент из массива?

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

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

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

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

strawberry удаляется.

Чтобы полностью объяснить:

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

Ответ 1

Используйте 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]);
}

Ответ 2

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

$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.

Ответ 3

if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

Ответ 4

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

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]) не изменяет порядок массива.

Ответ 5

Вы можете использовать фильтр массива для удаления элементов по определенному условию в $v:

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

Ответ 6

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

    // 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]);
    }

Ответ 7

Будет выглядеть так:

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

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

 $array_res = array_filter($array, "rmv_val");

Ответ 8

В настоящее время я использую эту функцию:

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

ИЛИ

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

Он также переиндексирует его.

Ответ 9

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

Ответ 10

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

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

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

Он отлично делится, вы можете удалить столько элементов, сколько хотите, если хотите.

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

Ответ 11

На этот вопрос есть несколько ответов, но я хочу добавить кое-что еще, потому что, когда я использовал 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

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

Ответ 12

Я бы предпочел использовать array_key_exists для поиска ключей в массивах вроде:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

чтобы найти заданное эффективно, так как здесь не работают array_search и in_array(). И удалите материал с помощью unset().

Я думаю, что это поможет кому-то.

Ответ 13

Создать числовой массив с удалением определенного значения массива

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Вы можете посмотреть эту ссылку..

Ответ 14

$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

Ответ 15

<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

Ответ 16

Я искал ответ на тот же вопрос и наткнулся на эту тему. Я вижу два основных способа: сочетание array_search & unset и использование array_diff. На первый взгляд мне показалось, что первый метод будет быстрее, поскольку не требует создания дополнительного массива (как при использовании array_diff). Но я написал небольшой тест и убедился, что второй метод не только более лаконичен, но и быстрее! Рад поделиться этим с вами. :)

https://glot.io/snippets/f6ow6biaol

Ответ 17

Просто вы можете сделать одну строку. Это будет удалить элемент из массива


$array=array_diff($array,['strawberry']);


Ответ 18

Используя array_seach(), попробуйте следующее:

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

array_search() возвращает ключ найденного элемента, который может быть использован для удаления этого элемента из исходного массива с помощью unset(). Он будет возвращать FALSE при сбое, однако он может вернуть значение "falsey" при успешном завершении (например, ваш ключ может быть 0), поэтому используется оператор строгого сравнения !==.

Оператор if() проверяет, вернул ли значение array_search() значение, и выполнит действие только в том случае, если оно произошло.

Ответ 19

unset($array[array_search('strawberry', $array)]);

Ответ 20

$delete = "клубника";

$index = array_search ($ delete, $array);

array_splice ($ array, $index, 1);

Ответ 21

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);