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

joost

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

 

NLspieler

Код (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]

 

joost

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

 

Simpliest

PHP:
  1. <?php
  2. unset($array[array_search(‘somevalue’, $array)]);

Естественно что при отсутствии элемента удалится не тот что нужно.
Поэтому развернешь код и вставишь проверку сам.

 

Mr.M.I.T.

Simpliest

Mr.M.I.T.
Бгг :) Дураки думают одинаково :)

 

NLspieler

Simpliest,
Mr.M.I.T.

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

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

 

Simpliest

Как ты можешь заметить приведенный выше код можно записать в одну строку даже с проверкой включительно.

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

 

samba33

Можно еще загнать удаляемое значение в массив и использовать array_diff

 

titch

samba33, зачет! сам так делаю. но для многомерок не канает, это раз. и проблемы с ключами — это два

 

tommyangelo

А давайте еще через полтора года соберемся

 

titch

бывает и круче

 

tommyangelo

titch

)))) упал под стол))

 

Antifreez2

Вот и собрались ;)

 

pl17

К собранию: :)

Код (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. }

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

 

artoodetoo

зачем два раза выполнять одно и то же, да еще в цикле?!

Код (PHP):
  1. while (($i = array_search($value, $array)) !== false) {
  2.     unset($array[$i]);
  3. } 
 

igordata

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

 

dp_master

Код (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.  
 

igordata

хехе

 

Fell-x27

ну…технически не такой прям и грешный некропост, ведь запощщено по делу и без обращений к автору. Всяко на пользу миру.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *