2010-03-15 5 views
106

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

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

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

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

strawberry удаляется.

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

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

+3

Тот же вопрос: http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key – trante

+0

Еще один и тот же вопрос: http://stackoverflow.com/ вопросы/1883421/remove-array-item-by-value –

+0

еще один вопрос: https://stackoverflow.com/questions/369602/php-delete-an-element-from-an-array – AXL

ответ

218

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

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

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

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

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

Получение нечетного результата. Я использовал ваше первое предложение, так как всегда будет только один экземпляр. Чтобы проверить это, я просто получил значение ключа. Работал. Однако, он не будет отменен. – dcp3450

+0

@ dcp3450: Вы уверены? Это работает как прелести для меня. – Gumbo

+1

в то время как (odbc_fetch_row ($ runqueryGetSubmenus)) \t \t { \t \t \t $ submenuList = odbc_result ($ runqueryGetSubmenus, "подменю"); \t \t \t $ submenuArray = split (',', $ submenuList); \t \t \t \t \t \t если (($ ключ = array_search ($ имя, $ submenuArray)) == ложь!) \t \t \t { \t \t \t \t снята с охраны ($ submenuArray [$ ключ]); \t \t \t} \t \t \t \t \t} – dcp3450

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

Вы должны проверить, если * земляника * находится в массиве вообще. – Gumbo

+0

Следуя совету Gumbo, измените ответ, чтобы включить проверку элемента перед его удалением из массива. –

+1

Также имейте в виду, что индексы не перестраиваются после удаления определенного элемента. Другими словами, индексная последовательность будет иметь пробелы. Если вы удалите «клубнику» из вашего примера, «киви» по-прежнему будет иметь индекс 4, а индекс 2 просто исчезнет. Имеет значение, если ваш код зависит от полноты индексной последовательности, например, для циклов ($ i = 0; $ i <.., $ i ++). –

1

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

+1

Ваша запись - комментарий не ответ. Пожалуйста, удалите и отправьте сообщение по самому вопросу. – mickmackusa

2

будет выглядеть следующим образом:

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

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

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

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

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

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

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

+1

Downvote. Это дубликат метода Гумбо (в настоящее время принятого решения), который был опубликован за несколько лет до вас. Дублированные ответы не имеют ценности и только вызывают ненужное раздувание страниц. Пожалуйста, удалите свой ответ. Если вы хотите объяснить ответ Гумбо, сделайте это с помощью редактирования его ответа или попросите Gumbo расширить свой собственный ответ. – mickmackusa

6

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

+0

Downvote. Это низкокачественное (потому что это ответ только на код и дает ошибку синтаксического анализа) является дубликатом метода Д.Мартина, который просто использует анонимную функцию внутри 'array_filter()'. Хотя я лично использовал анонимную функцию в моей реализации, я считаю, что правильные действия в отношении SO состоят в том, чтобы прокомментировать или отредактировать ответ Д.Мартина, если вы хотите сделать микро-улучшение, чтобы эта страница не раздувалась. Удалите этот дублированный ответ. – mickmackusa

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

Downvote. Метод 'array_search()' -'unset() 'был уже отправлен Джоном Конде за несколько лет до вашего. Дублированные ответы не имеют для читателей ценности и на самом деле являются неудобством из-за времени, потраченного впустую при прокрутке и чтении избыточной информации. Удалите этот ответ. – mickmackusa

94

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

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

+4

Это решение является более разборчивым, чем верхние. – Robbert

+0

Хотя, если 'strawberry' не находится в начальном массиве, он станет доступен в массиве' $ array_without_strawberries' - опасный код, если вы хотите убедиться, что данный элемент не находится в массиве. – Erfan

+3

@Erfan Ваша претензия неверна. '$ a = array_diff (array(), array ('strawberry'));' - $ a - пустой массив. – bancer

0

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

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

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

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

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

Также добавьте пояснения. Как это решает проблему. –

+0

ваш ответ заменит один элемент массива на другой NO, чтобы удалить элемент –

+0

Downvote. Этот ответ не дает ожидаемого результата. Удалите этот неправильный ответ. – mickmackusa

16

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

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

unset($array[$key]) только удаляет элемент, но не изменить порядок простого массива ,

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

+0

Официально 'unset' ничего не возвращает. Поэтому 'json_encode (unset ($ array [2]))' не подходит для сравнения. – robsch

3

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

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

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

+0

Это ужасно запутанное и замкнутое. Как это получило 3 upvotes?!? – mickmackusa

4

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

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

Это неэффективная домашняя замена для того, что разработчики PHP уже создали в 'array_diff()'. Как это получилось, три раза. Никто не должен находить этот ответ полезным или использовать его в своих проектах. Я рекомендую удалить этот ответ - это поможет освободить вашу учетную запись из-за низкого качества ответа, уменьшить раздувание ответа на этой странице и заработать вам Дисциплинированный значок. Я откладываю свой нисходящий клик, чтобы у вас было время удалить за вознаграждение. – mickmackusa

0

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

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

    ?> 

You Can Refer this link..

+0

Downvote. Вопрос четко направлен на удаление значения на основе значения (а не ключа). Этот ответ бесполезен, пожалуйста, удалите. – mickmackusa

0

Ответ на PHP array delete by value (not key) Предоставлено https://stackoverflow.com/users/924109/rok-kralj

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

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

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

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

-1

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

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

array_splice ($ array, $ index, 1);

+0

На этой странице уже есть намного лучшие ответы. –

+0

Я только что отредактировал код ... –

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

Этот ответ даже не удаляет требуемую опцию. –

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

Вы можете улучшить этот ответ, написав предложение или два о a), что делает код, и b) почему вы считаете, что это вариант среди всех других ответов. –

Смежные вопросы