it-swarm.com.ru

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

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

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

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

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

strawberry удаляется.

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

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

124
dcp3450

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

Используйте 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.

115
ills
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
34
John Conde

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

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']

По сравнению с неустановленным:

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

18
ericluwj

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

6
srcspider

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

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

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

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

Это также переиндексирует это.

3
jankal

Будет так:

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

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

 $array_res = array_filter($array, "rmv_val");
2
D.Martin

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

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

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

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

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

1
hounded

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

1
jishi

На этот вопрос есть несколько ответов, но я хочу добавить кое-что еще, потому что когда я использовал 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
Jordan Montel
$remove= "strawberry";
$array = ["Apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
0
Krishna Jonnalagadda

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

https://glot.io/snippets/f6ow6biaol

0
ПЭХАПЭШНИК
<?php 
$array = array("Apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
0
Onome Mine Adamu

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

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

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

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

0
ddsultan

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

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

    ?>

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

0
Sashtha Manik