У меня есть набор результатов Db, которые хранятся в объекте. Мне нужно просмотреть результаты и проверить свойство (используя другой запрос БД), а затем использовать оператор if для удаления элемента из объекта. Вот упрощенная версия того, что я пытаюсь сделать:
foreach ($products as $product) { if(!$product->active) { unset($product); } } print_r($products);
Однако, когда я печатаю_r, элементы все еще находятся в объекте. Я смущаюсь.
Это ожидаемое поведение. Есть два основных способа сделать то, что вы хотите
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]); } }