Как удалить элемент массива в цикле foreach?
Я хочу пройти через массив с foreach чтобы проверить, существует ли значение. Если значение Существует, я хочу удалить элемент, который его содержит.
у меня есть следующий код:
Я не знаю, как удалить элемент после того, как значение найдено. Как его удалить?
8 ответов
Если вы также получите ключ, вы можете удалить этот элемент следующим образом:
лучшим решением является использование array_filter функция:
поскольку foreach полагается на внутренний указатель массива в PHP 5, изменение его в цикле может привести к неожиданному поведению.
в PHP 7 foreach не использует внутренний указатель массива.
вместо выполнения цикла foreach() в массиве было бы быстрее использовать array_search (), чтобы найти правильный ключ. На небольших массивах я бы пошел с foreach для лучшей читаемости, но для больших массивов или часто выполняемого кода это должно быть немного более оптимальным:
Как уже упоминалось, вы хотели бы сделать foreach с ключом и unset с помощью ключа, но обратите внимание, что мутация массива во время итерации в целом плохая идея, хотя я не уверен в правилах PHP на этом навскидку.
если у вас есть сценарий, в котором вам нужно удалить несколько значений из массива foreach, в этом случае вам нужно передать значение по ссылке для каждого: Я пытаюсь объяснить этот сценарий:
во втором цикле вы хотите, чтобы отключить первые циклы записи не приходят снова в итерации для целей производительности или же затем отключить из памяти, потому что в памяти они присутствуют и будут поступать в итерациях.
уже есть ответы, которые дают свет о том, как отключить. Вместо того, чтобы повторять код во всех классах, сделайте функцию, как показано ниже, и используйте ее в коде, когда это необходимо. В бизнес-логике иногда вы не хотите раскрывать некоторые свойства. Пожалуйста, смотрите ниже один вызов лайнера, чтобы удалить
Удалить элемент массива php foreach
You can also use the alternative syntax for the foreach cycle:
I cannot stress this point of the documentation enough! Here is a simple example of exactly why this must be done:
Even though it is not mentioned in this article, you can use «break» control structure to exit from the «foreach» loop.
WARNING: Looping through «values by reference» for «extra performance» is an old myth. It’s actually WORSE!
?>
Which do you think is faster?
Lots of people think the answer is two() because it uses «reference to value, which it doesn’t have to copy each value when it loops».
Well, that’s totally wrong!
Here’s what actually happens:
Alright, so what’s the second version doing? The beloved «iterate values by reference»?
— This function takes an array as argument ($arr).
— The array function argument itself isn’t passed by reference, so the function knows it isn’t allowed to modify the original at all.
— Then the foreach loop happens. The array itself wasn’t passed by reference to the function, so PHP knows that it isn’t allowed to modify the outside array.
— But it also sees that you want to look at all VALUES by reference (&$val), so PHP says «Uh oh, this is dangerous. If we just give them references to the original array’s values, and they assign some new value to their reference, they would destroy the original array which they aren’t allowed to touch!».
— So PHP makes a FULL COPY of the ENTIRE array and ALL VALUES before it starts iterating. YIKES!
Therefore: STOP using the old, mythological «&$val» iteration method! It’s almost always BAD! With worse performance, and risks of bugs and quirks as is demonstrated in the manual.
You can always manually write array assignments explicitly, without references, like this:
How do you remove an array element in a foreach loop?
I want to loop through an array with foreach to check if a value exists. If the value does exist, I want to delete the element which contains it.
I have the following code:
I don’t know how to delete the element once the value is found. How do I delete it?
7 Answers 7
If you also get the key, you can delete that item like this:
A better solution is to use the array_filter function:
As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior.
In PHP 7, foreach does not use the internal array pointer.
Instead of doing foreach() loop on the array, it would be faster to use array_search() to find the proper key. On small arrays, I would go with foreach for better readibility, but for bigger arrays, or often executed code, this should be a bit more optimal:
if you have scenario in which you have to remove more then one values from the foreach array in this case you have to pass value by reference in for each: I try to explain this scenario:
in second loop you want to unset first loops entries dont come again in the iteration for performance purpose or else then unset from memory as well because in memory they present and will come in iterations.
There are already answers which are giving light on how to unset. Rather than repeating code in all your classes make function like below and use it in code whenever required. In business logic, sometimes you don’t want to expose some properties. Please see below one liner call to remove
Как удалить элемент массива в цикле foreach?
У меня есть следующий код:
Я не знаю, как удалить элемент после нахождения значения. Как его удалить?
ОТВЕТЫ
Ответ 1
Если вы также получите ключ, вы можете удалить этот элемент следующим образом:
Ответ 2
Лучшим решением является использование функции array_filter :
Как написано в документации по php:
Поскольку foreach полагается на указатель внутреннего массива в PHP 5, изменение его в цикле может привести к неожиданному поведению.
В PHP 7 foreach не использует указатель внутреннего массива.
Ответ 3
Ответ 4
Вместо того, чтобы делать цикл foreach() в массиве, было бы быстрее использовать array_search(), чтобы найти правильный ключ. На небольших массивах я бы пошел с foreach для лучшей читаемости, но для больших массивов или часто исполняемого кода это должно быть немного более оптимальным:
Ответ 5
Если ваш массив проиндексирован (неассоциативный), вы можете захотеть использовать array_splice вместо unset, поэтому номера индексов переупорядочиваются соответствующим образом.
Это позволяет избежать потенциальной проблемы с циклами, которые используют инкрементный индекс.
Ответ 6
Ответ 7
Ответ 8
Если у вас есть сценарий, в котором вам нужно удалить более одного значения из массива foreach, в этом случае вам нужно передать значение по ссылке для каждого: Я пытаюсь объяснить этот сценарий:
во втором цикле, который вы хотите отменить записи первых циклов, не возвращаются в итерации для целей производительности, а затем также не учитываются в памяти, потому что в памяти они присутствуют и будут поступать в итерациях.
Ответ 9
Уже есть ответы, которые дают информацию о том, как отключиться. Вместо того, чтобы повторять код во всех ваших классах, выполните функцию, как показано ниже, и используйте ее в коде при необходимости. В бизнес-логике иногда вы не хотите раскрывать некоторые свойства. См. Ниже один вызов лайнера для удаления
Удаление элемента в массиве PHP
Массив – одна из самых полезных и часто используемых структур данных в любом языке программирования. Уметь управлять массивами и их элементами очень важно и полезно. В данной статье рассмотрим, как можно удалить отдельные элементы массива в PHP.
Данная задача может быть реализована разными методами, в зависимости от того, что мы знаем об удаляемом элементе – известен ли ключ (номер или идентификатор элемента в массиве) или только его значение.
Удаление элемента в массиве по его ключу
Если известен ключ элемента, то задача очень проста. Функция unset() позволяет удалить элемент массива или любую переменную (так же будет очищена задействованная под переменную память компьютера).
Например, имеем массив:
Для удаления элемента со значением «3» используем код:
Обратите внимание, что указывается не значение (3), а ключ элемента (2), начинающийся, в данном случае с 0. Так, если нужно удалить первый элемент массива, то указываем нулевой элемент:
Так же стоит учитывать, что после наших двух удалений, массив теперь содержит три элемента:
Все ключи оставшихся элементов сохраняются. Соответственно, если теперь нужно будет удалить первый элемент, то указывать надо будет в качестве ключа единицу. Поэтому, а так же, потому что мы не всегда знаем номер элемента в массиве, а лишь его значения такой вариант может не подходить.
Удаление элемента массива по его значению
Если ключ элемента не известен, а известно только значение массива, то придется перебрать все элементы массива циклом и удалить искомый. Например, удаляем элемент со значением «3»:
Такое алгоритм подходит еще и в случае, если нужно удалить сразу группу элементов. Ведь здесь имеется условие, определяющее какие элементы удалять.
Удаление пересекающихся элементов массива
Применив функцию array_diff(), получим новый массив, содержащий только необходимые элементы:
