Intereting Posts
PHP Xpath: получить все значения href, содержащие иглу Поля групповой формы в Symfony2 Как сохранить китайский или другой иностранный язык, как они есть, вместо того, чтобы превращать их в коды? socket_connect не отключается Выберите результаты, которые будут только между сегодняшним днем ​​и 2 днями в будущем. категории wp-запроса и имеет тег Как я могу использовать PHP IDE для контейнеров для инъекций зависимостей? Кэш Cakephp cake_core_ не смог написать 'cake_dev_en-us' PHP разные односторонние хэши для защиты паролем Вытягивание сообщений с другого сайта WordPress Запрос не сортируется должным образом PHP build для Jenkins с ошибкой: «Не удается запустить программу phploc», Каков наилучший способ использования API Twitter через PHP? Уникальное ограничение электронной почты для проверки подлинности Laravel 4 Обновите все цены на товары WooCommerce до 2 десятичных знаков в базе данных

Удаление объекта из объекта в цикле

У меня есть набор результатов Db, которые хранятся в объекте. Мне нужно просмотреть результаты и проверить свойство (используя другой запрос БД), а затем использовать оператор if для удаления элемента из объекта. Вот упрощенная версия того, что я пытаюсь сделать:

foreach ($products as $product) { if(!$product->active) { unset($product); } } print_r($products); 

Однако, когда я печатаю_r, элементы все еще находятся в объекте. Я смущаюсь.

Related of "Удаление объекта из объекта в цикле"

Это ожидаемое поведение. Есть два основных способа сделать то, что вы хотите

 foreach ($products as $key => $product) { if(!$product->active) { unset($product[$key]); } } с foreach ($products as $key => $product) { if(!$product->active) { unset($product[$key]); } } 

Второй способ – использовать ссылку

 foreach ($products as &$product) { if(!$product->active) { unset($product); } } с foreach ($products as &$product) { if(!$product->active) { unset($product); } } 

Вместо этого используйте эту строку:

 foreach ($products as &$product) 

Вам нужно понять, что отмена объекта не влияет на php. Прежде всего позвольте мне объяснить вам важную деталь с FOREACH:

если вы это сделаете:

 $a = array(1,2,3,4,5); foreach($a as $b){ unset($b); } с $a = array(1,2,3,4,5); foreach($a as $b){ unset($b); } 

$ a будет сначала скопирован в память. Это не грубая копия, скажем, она копирует только ссылку на данные и увеличивает количество использования массива (1,2,3,4,5) в памяти. Внутри $ b у вас будут копии данных, найденных в $ a. Поэтому, отбрасывая его из памяти, он говорит, что не выбрал $ b из копии $ a. Поэтому, не делая никаких изменений в реальном $ a.

Если вы должны были сделать:

 $a = array(1,2,3,4,5); foreach($a as $key => $b){ unset($a[$key]); } с $a = array(1,2,3,4,5); foreach($a as $key => $b){ unset($a[$key]); } 

Тогда у вас будет копия $ a в памяти. Foreach будет перебирать (цикл) на эту копию и предоставлять вам ключи для каждого элемента $ a, который копируется в $ b. Когда вы отключаете ($ a [$ key]), вы указываете php влиять на массив в $ a, который был скопирован при запуске foreach, но теперь вместо того, чтобы влиять на копию, вы используете ключ $ для ссылки на элемент в $ который действительно существует в памяти и к которому у вас будет доступ.

Теперь для второй части, если мы посмотрим на объекты … удаление объекта не имеет никакого эффекта, поскольку переменные, содержащие объекты, являются только ссылками на данные в памяти со счетчиком. Если вы $ a = новый Object (), а затем $ b = $ a, вы создаете новую ссылку на этот объект, сохраняя его неповрежденным (не скопированным).

Если вы должны были отменить ($ a), вы только отменили бы ссылку на объект, а $ b все равно указали бы на этот объект в памяти. Если вы отмените ($ b), вы отмените ссылку на объект из памяти, потому что ничего не указывает на это.

Надеюсь, что это станет яснее …

Удачи

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

 foreach ($products as $key => $product) { if(!$product->active) { unset($products[$key]); } } этот foreach ($products as $key => $product) { if(!$product->active) { unset($products[$key]); } } не foreach ($products as $key => $product) { if(!$product->active) { unset($products[$key]); } } 

попробуй это:

 // $id is the key, $product is the value foreach ($products as $id => $product) { if(!$product->active) { unset($products[$id]); } } не // $id is the key, $product is the value foreach ($products as $id => $product) { if(!$product->active) { unset($products[$id]); } }