Как удалить элемент массива в цикле foreach?

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

У меня есть следующий код:

 foreach($display_related_tags as $tag_name) { if($tag_name == $found_tag['name']) { // Delete element } } 

Я не знаю, как удалить элемент после нахождения значения. Как его удалить?

Я должен использовать foreach для этой проблемы. Вероятно, есть альтернативы foreach , и вы можете поделиться ими.

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

 foreach ($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) { unset($display_related_tags[$key]); } } не foreach ($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) { unset($display_related_tags[$key]); } } 

Лучшим решением является использование функции array_filter :

 $display_related_tags = array_filter($display_related_tags, function($e) use($found_tag){ return $e != $found_tag['name']; }); 

Как написано в документации по php:

Поскольку foreach полагается на указатель внутреннего массива в PHP 5, изменение его в цикле может привести к неожиданному поведению.

 foreach($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) unset($display_related_tags[$key]; } не foreach($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) unset($display_related_tags[$key]; } 

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

 $result=array_search($unwantedValue,$array,true); if($result !== false) { unset($array[$result]); } с $result=array_search($unwantedValue,$array,true); if($result !== false) { unset($array[$result]); } 

Требуется строгий оператор сравнения! ==, потому что array_search () может возвращать 0 в качестве индекса $ unwantedValue.

Кроме того, в приведенном выше примере будет удаляться только первое значение $ unwantedValue, если $ unwantedValue может встречаться более одного раза в массиве $, вы должны использовать array_keys (), чтобы найти все из них:

 $result=array_keys($array,$unwantedValue,true) foreach($result as $key) { unset($array[$key]); } с $result=array_keys($array,$unwantedValue,true) foreach($result as $key) { unset($array[$key]); } 

Подробнее см. http://php.net/manual/en/function.array-search.php.

Если ваш массив проиндексирован (неассоциативный), вы можете захотеть использовать array_splice вместо unset, поэтому номера индексов переупорядочиваются соответствующим образом.

 foreach ($arr as $key => $value) { if($value == 'whatever') { array_splice($arr, $key, 1); } } 

Если у вас есть, например, этот индексированный массив: $arr = [200,400,600];

  • Использование unset во втором элементе ([1]) приведет к следующему массиву:
 array(2) { [0]=> int(200) [2]=> int(600) } 
  • Использование array_splice во втором элементе ([1]) приведет к следующему массиву:
 array(2) { [0]=> int(200) [1]=> int(600) } 

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

Попытайтесь использовать функции next() , current() в while for цикла.

Как уже упоминалось, вы хотели бы сделать foreach с ключом и не использовать ключ – но обратите внимание, что мутация массива во время итерации в общем случае плохая идея, хотя я не уверен в правилах PHP по этому экспромтом.

если у вас есть сценарий, в котором вам нужно удалить более одного значения из массива foreach, в этом случае вам нужно передать значение по ссылке для каждого: я пытаюсь объяснить этот сценарий:

 foreach ($manSkuQty as $man_sku => &$man_qty) { foreach ($manufacturerSkus as $key1 => $val1) { // some processing here and unset first loops entries // here dont include again for next iterations if(some condition) unset($manSkuQty[$key1]); } } } с foreach ($manSkuQty as $man_sku => &$man_qty) { foreach ($manufacturerSkus as $key1 => $val1) { // some processing here and unset first loops entries // here dont include again for next iterations if(some condition) unset($manSkuQty[$key1]); } } } 

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

Уже есть ответы, которые дают информацию о том, как отключиться. Вместо того, чтобы повторять код во всех ваших классах, выполните функцию, как показано ниже, и используйте ее в коде при необходимости. В бизнес-логике иногда вы не хотите раскрывать некоторые свойства. См. Ниже один вызов лайнера для удаления

 public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset) { if (empty($associativeArray) || empty($keysToUnset)) return array(); foreach ($associativeArray as $key => $arr) { if (!is_array($arr)) { continue; } foreach ($keysToUnset as $keyToUnset) { if (array_key_exists($keyToUnset, $arr)) { unset($arr[$keyToUnset]); } } $associativeArray[$key] = $arr; } return $associativeArray; } с public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset) { if (empty($associativeArray) || empty($keysToUnset)) return array(); foreach ($associativeArray as $key => $arr) { if (!is_array($arr)) { continue; } foreach ($keysToUnset as $keyToUnset) { if (array_key_exists($keyToUnset, $arr)) { unset($arr[$keyToUnset]); } } $associativeArray[$key] = $arr; } return $associativeArray; } 

Назовите:

 removeKeysFromAssociativeArray($arrValues, $keysToRemove);