За последние 24 часа нас посетили 22647 программистов и 1145 роботов. Сейчас ищет 761 программист ...

Удалить елемент массива по значению

Тема в разделе "PHP для новичков", создана пользователем joost, 30 дек 2009.

  1. joost

    joost Guest

    Как удалить елемент массива по значению ?
    п/с Индекс елемента не известен.
     
  2. NLspieler

    NLspieler Активный пользователь

    С нами с:
    30 дек 2009
    Сообщения:
    4
    Симпатии:
    0
    Код (PHP):
    1. <?php
    2.  
    3. $array = array ('фигня' , 'ботва' , 'ерунда') ; //Массив для примера
    4.  
    5. $value_to_delete = 'фигня' ; //Элемент с этим значением нужно удалить
    6. $array = array_flip($array); //Меняем местами ключи и значения
    7. unset ($array[$value_to_delete]) ; //Удаляем элемент массива
    8. $array = array_flip($array); //Меняем местами ключи и значения
    9.  
    10. print_r ($array) ; //Распечатываем массив
    11.  
    12.  
    13. ?>
    [/code]

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  3. joost

    joost Guest

    NLspieler
    многовато кода
    проще никак?
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1. <?php
    2. unset($array[array_search('somevalue', $array)]);
    Естественно что при отсутствии элемента удалится не тот что нужно.
    Поэтому развернешь код и вставишь проверку сам.
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Mr.M.I.T.
    Бгг :) Дураки думают одинаково :)
     
  7. NLspieler

    NLspieler Активный пользователь

    С нами с:
    30 дек 2009
    Сообщения:
    4
    Симпатии:
    0
    Simpliest,
    Mr.M.I.T.

    как вы наверное сами заметили, если значения нет, то удаляется первый элемент массива.
    Во-вторых, удаляется только один элемент с нужным значением, а не все.

    joost
    Какая разница, сколько места занимает код?
    Главное не это, а то, сколько времени он выполняется и сколько затрачивает ресурсов.
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Как ты можешь заметить приведенный выше код можно записать в одну строку даже с проверкой включительно.

    Без флипов массива. Который с точки зрения ресурсов несколько сложнее простого поиска :)
     
  9. samba33

    samba33 Активный пользователь

    С нами с:
    21 апр 2011
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Хмельницкий
    Можно еще загнать удаляемое значение в массив и использовать array_diff
     
  10. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    samba33, зачет! сам так делаю. но для многомерок не канает, это раз. и проблемы с ключами - это два
     
  11. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    А давайте еще через полтора года соберемся
     
  12. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    бывает и круче
     
  13. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    titch

    )))) упал под стол))
     
  14. Antifreez2

    Antifreez2 Активный пользователь

    С нами с:
    10 фев 2014
    Сообщения:
    10
    Симпатии:
    0
    Вот и собрались ;)
     
  15. pl17

    pl17 Новичок

    С нами с:
    3 дек 2014
    Сообщения:
    2
    Симпатии:
    0
    К собранию: :)

    Код (Text):
    1.  
    2. function checkArraySearch($value_for_search, $array)
    3. {
    4.     if (array_search($value_for_search, $array) !== FALSE) {
    5.         return true;
    6.     } else {
    7.         return false;
    8.     }
    9. }
    10.  
    11. while (checkArraySearch($value_for_search, $array)) {
    12.     unset($array[array_search($value_for_search, $array)]);
    13. }
    Удаляет из массива все элементы значения которых равны искомому, и так же не обладает проблемой с удалением первых элементов массива.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    зачем два раза выполнять одно и то же, да еще в цикле?!
    Код (PHP):
    1. while (($i = array_search($value, $array)) !== false) {
    2.     unset($array[$i]);
    3. } 
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ты ж не мог не заметить, что у тебя функция два раза вызывается. Это звоночек, что код требует переосмысления. Обращай на это внимание.
     
  18. dp_master

    dp_master Активный пользователь

    С нами с:
    10 дек 2015
    Сообщения:
    2
    Симпатии:
    1
    Код (PHP):
    1. //Вариант 1
    2. function rm_from_array($needle, &$array, $all = true){
    3.     foreach(array_keys($array,$needle) as $key){
    4.         unset($array[$key]);
    5.         if(!$all)return;
    6.     }
    7. }
    8. //Вариант 2
    9. function rm_from_array2($needle, &$array, $all = true){
    10.     while(FALSE !== $key = array_search($needle,$array)){
    11.         unset($array[$key]);
    12.         if(!$all)return;
    13.     }
    14. }
    15.  
    16. //Вариант 3 - быстрый
    17. function rm_from_array3($needle, &$array, $all = true){
    18.     if(!$all){
    19.         if(FALSE !== $key = array_search($needle,$array)) unset($array[$key]);
    20.         return;
    21.     }
    22.     foreach(array_keys($array,$needle) as $key){
    23.         unset($array[$key]);
    24.     }
    25. }
    26.  
    Первый вариант выигрывает по скорости (примерно в 800 раз быстрее в моих тестах) с большими массивами у второго, если удалять все значения. Если удалять первое, то второй вариант шустрее. Поэтому есть третий вариант, он выигрывает у обоих. Тестил на массиве из 10000 записей
    Код (PHP):
    1. $array = array ('фигня' , 'ботва' , 'ерунда');
    2. for($i=0;$i<10000;$i++){
    3.     $test[] = $array[rand(0,2)];
    4. }
    5.  
     
    starfelliks нравится это.
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хехе
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    ну...технически не такой прям и грешный некропост, ведь запощщено по делу и без обращений к автору. Всяко на пользу миру.
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    И всё ещё первая страница.
     
  22. RumusBin

    RumusBin Новичок

    С нами с:
    17 сен 2016
    Сообщения:
    9
    Симпатии:
    0
    Вот Вам и хехе! Полезный Пост, оказался!!
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  24. starfelliks

    starfelliks Новичок

    С нами с:
    9 янв 2017
    Сообщения:
    1
    Симпатии:
    0
    Только что искал "php удалить из масива по значению" - наткнулся на пост, вспомнил что уже его видел пару лет назад и что на том же моем сайте, где делаю новый функционал, уже в функциях есть ваша функция))

    PHP:
    1. function del_from_array($needle, &$array, $all = true){
    2.         if(!$all){
    3.             if(FALSE !== $key = array_search($needle,$array)) unset($array[$key]);
    4.             return;
    5.         }
    6.         foreach(array_keys($array,$needle) as $key){
    7.             unset($array[$key]);
    8.         }
    9. }
    Спасибо однако. Пост реально полезный))
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    для спасибо есть лайки