Как удалить элемент массива в цикле foreach?
Я хочу, чтобы цикл через массив с foreach
чтобы проверить, существует ли значение. Если значение Существует, я хочу удалить элемент, который его содержит.
у меня есть следующий код:
foreach($display_related_tags as $tag_name) {
if($tag_name == $found_tag['name']) {
// Delete element
}
}
Я не знаю, как удалить элемент, как только значение найдено. Как его удалить?
Я должен использовать foreach
этой проблемы. Вероятно, есть альтернативы foreach
, и вы можете поделиться ими.
8 ответов:
Если вы также получите ключ, вы можете удалить этот элемент следующим образом:
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 документация гласит:
в PHP 7 foreach не использует внутренний указатель массива.
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]); }
строгий оператор сравнения != = необходимо, потому что array_search () может возвращать 0 в качестве индекса $unwantedValue.
кроме того, приведенный выше пример удалит только первое значение $unwantedValue, если $unwantedValue может возникать более одного раза в массиве$, вы должны использовать array_keys (), чтобы найти их все:
$result=array_keys($array,$unwantedValue,true) foreach($result as $key) { unset($array[$key]); }
проверить http://php.net/manual/en/function.array-search.php для получения дополнительной информации.
Как уже упоминалось, вы хотели бы сделать 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]); } } }
во втором цикле вы хотите снять первые циклы записи не приходят снова в итерации для целей производительности или же затем снять из памяти, а потому, что в памяти они присутствуют и будут приходить в итерациях.
уже есть ответы, которые дают свет о том, как отключить. Вместо того, чтобы повторять код во всех ваших классах, сделайте функцию, как показано ниже, и используйте ее в коде, когда это необходимо. В бизнес-логике иногда вы не хотите раскрывать некоторые свойства. Пожалуйста, смотрите ниже один лайнер вызов, чтобы удалить
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);