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

Мне нужно удалить элемент массива с заданным значением:

if (in_array($id, $items)) { $items = array_flip($items); unset($items[ $id ]); $items = array_flip($items); } 

Может ли это быть более коротким (более эффективным) способом?

  • No related posts
  • 10 responses to “Удаление элемента массива по значению”

      Алехандро Иглесиас said:

      Это можно сделать с помощью простого однострочного вкладыша.

      Имея этот массив:

       $arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also'); 

      Ты можешь сделать:

       $arr = array_diff($arr, array('remove_me', 'remove_me_also')); 

      И значение $arr будет:

       array('nice_item', 'another_liked_item') 

      Надеюсь, что это поможет написать красивый код.

      zombat said:

      Я добавляю второй ответ. Я написал сценарий быстрого тестирования, чтобы попробовать различные методы здесь.

       $arr = array(0 => 123456); for($i = 1; $i < 500000; $i++) { $arr[$i] = rand(0,PHP_INT_MAX); } shuffle($arr); $arr2 = $arr; $arr3 = $arr; /** * Method 1 - array_search() */ $start = microtime(true); while(($key = array_search(123456,$arr)) !== false) { unset($arr[$key]); } echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 2 - basic loop */ $start = microtime(true); foreach($arr2 as $k => $v) { if ($v == 123456) { unset($arr2[$k]); } } echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 3 - array_keys() with search parameter */ $start = microtime(true); $keys = array_keys($arr3,123456); foreach($keys as $k) { unset($arr3[$k]); } echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>'; с $arr = array(0 => 123456); for($i = 1; $i < 500000; $i++) { $arr[$i] = rand(0,PHP_INT_MAX); } shuffle($arr); $arr2 = $arr; $arr3 = $arr; /** * Method 1 - array_search() */ $start = microtime(true); while(($key = array_search(123456,$arr)) !== false) { unset($arr[$key]); } echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 2 - basic loop */ $start = microtime(true); foreach($arr2 as $k => $v) { if ($v == 123456) { unset($arr2[$k]); } } echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 3 - array_keys() with search parameter */ $start = microtime(true); $keys = array_keys($arr3,123456); foreach($keys as $k) { unset($arr3[$k]); } echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>'; с $arr = array(0 => 123456); for($i = 1; $i < 500000; $i++) { $arr[$i] = rand(0,PHP_INT_MAX); } shuffle($arr); $arr2 = $arr; $arr3 = $arr; /** * Method 1 - array_search() */ $start = microtime(true); while(($key = array_search(123456,$arr)) !== false) { unset($arr[$key]); } echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 2 - basic loop */ $start = microtime(true); foreach($arr2 as $k => $v) { if ($v == 123456) { unset($arr2[$k]); } } echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 3 - array_keys() with search parameter */ $start = microtime(true); $keys = array_keys($arr3,123456); foreach($keys as $k) { unset($arr3[$k]); } echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>'; с $arr = array(0 => 123456); for($i = 1; $i < 500000; $i++) { $arr[$i] = rand(0,PHP_INT_MAX); } shuffle($arr); $arr2 = $arr; $arr3 = $arr; /** * Method 1 - array_search() */ $start = microtime(true); while(($key = array_search(123456,$arr)) !== false) { unset($arr[$key]); } echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 2 - basic loop */ $start = microtime(true); foreach($arr2 as $k => $v) { if ($v == 123456) { unset($arr2[$k]); } } echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 3 - array_keys() with search parameter */ $start = microtime(true); $keys = array_keys($arr3,123456); foreach($keys as $k) { unset($arr3[$k]); } echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>'; 

      Третий метод, array_keys() с указанным необязательным параметром поиска, по-видимому, является лучшим методом. Пример вывода:

       499999 left, in 0.090957164764404 seconds 499999left, in 0.43156313896179 seconds 499999left, in 0.028877019882202 seconds 

      Судя по этому, решение, которое я бы использовал, было бы следующим:

       $keysToRemove = array_keys($items,$id); foreach($keysToRemove as $k) { unset($items[$k]); } не $keysToRemove = array_keys($items,$id); foreach($keysToRemove as $k) { unset($items[$k]); } 
      Алехандро Иглесиас said:

      Как насчет:

       if (($key = array_search($id, $items)) !== false) unset($items[$key]); 

      или для нескольких значений:

       while(($key = array_search($id, $items)) !== false) { unset($items[$key]); } не while(($key = array_search($id, $items)) !== false) { unset($items[$key]); } 

      Это также предотвратило бы потерю ключа, что является побочным эффектом array_flip() .

      Marek said:

      удалить $rm_val из $arr

       unset($arr[array_search($rm_val, $arr)]); 
      gturri said:

      Наиболее мощным решением будет использование array_filter , который позволит вам определить вашу собственную функцию фильтрации.

      Но некоторые могут сказать, что это немного перебор, в вашей ситуации …
      Простой цикл foreach проходящий через массив и удаляющий элемент, который вам не нужен, должен быть достаточным.

      Что-то вроде этого, в вашем случае, должно, вероятно, сделать трюк:

       foreach ($items as $key => $value) { if ($value == $id) { unset($items[$key]); // If you know you only have one line to remove, you can decomment the next line, to stop looping //break; } } не foreach ($items as $key => $value) { if ($value == $id) { unset($items[$key]); // If you know you only have one line to remove, you can decomment the next line, to stop looping //break; } } 
      Паскаль МАРТИН said:

      без флип:

       <?php foreach ($items as $key => $value) { if ($id === $value) { unset($items[$key]); } } не <?php foreach ($items as $key => $value) { if ($id === $value) { unset($items[$key]); } } 
      zombat said:

      Ваши решения работают только в том случае, если у вас есть уникальные значения в вашем массиве

      Видеть:

       <?php $trans = array("a" => 1, "b" => 1, "c" => 2); $trans = array_flip($trans); print_r($trans); ?> 

      Лучший способ был бы не задан с помощью array_search в цикле, если это необходимо.

      Savageman said:

      Попробуйте array_search ()

      zombat said:
       function deleteValyeFromArray($array,$value) { foreach($array as $key=>$val) { if($val == $value) { unset($array[$key]); } } return $array; } с function deleteValyeFromArray($array,$value) { foreach($array as $key=>$val) { if($val == $value) { unset($array[$key]); } } return $array; } 
      zombat said:

      Вы можете использовать функцию array_splice для этой операции Ref: array_splice

       array_splice($array, array_search(58, $array ), 1); 
    PHP is the Best Programming Language in the world.