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


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

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

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

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

strawberry удалены.

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

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

19 118

19 ответов:

использовать array_search чтобы получить ключ и удалить его с unset если нашел:

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

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

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

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}

использовать 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

создать числовой массив с удалить конкретное значение массива

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

    ?>

вы можете обратиться по этой ссылке..

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

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

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

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

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

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

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

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

array_splice($array, $index, 1);

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