Ответ 1
Если вы также получите ключ, вы можете удалить этот элемент следующим образом:
foreach ($display_related_tags as $key => $tag_name) {
if($tag_name == $found_tag['name']) {
unset($display_related_tags[$key]);
}
}
Я хочу перебрать массив с помощью 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]);
}
}
Лучшим решением является использование функции array_filter
:
$display_related_tags =
array_filter($display_related_tags, function($e) use($found_tag){
return $e != $found_tag['name'];
});
Как написано в документации по php:
Поскольку foreach полагается на указатель внутреннего массива в PHP 5, изменение его в цикле может привести к неожиданному поведению.
В 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.
Если ваш массив проиндексирован (неассоциативный), вы можете захотеть использовать array_splice вместо unset, поэтому номера индексов переупорядочиваются соответствующим образом.
foreach ($arr as $key => $value) {
if($value == 'whatever') {
array_splice($arr, $key, 1);
}
}
Если у вас есть, например, этот индексированный массив: $arr = [200,400,600];
array(2) { [0]=> int(200) [2]=> int(600) }
array(2) { [0]=> int(200) [1]=> int(600) }
Это позволяет избежать потенциальной проблемы с циклами, которые используют инкрементный индекс.
Как уже упоминалось, youd хочет сделать foreach с ключом и отключить использование ключа - но обратите внимание, что мутация массива во время итерации в общем-то плохая идея, хотя я не уверен в правилах PHP на этом небрежном.
Попробуйте использовать функции next()
, current()
в цикле while
, for
.
Если у вас есть сценарий, в котором вам нужно удалить более одного значения из массива 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);