PHP数组添加元素失败 直接赋值、array_push方法均不生效
问题根因
PHP的foreach循环默认以值拷贝的形式遍历数组元素,循环内拿到的$product是独立于原数组的临时副本,所有对$product的赋值、追加操作仅作用在这个临时变量上,循环结束后临时变量被回收,原购物车数组$cartitemCollection不会产生任何改动,因此两种写入方式都不会生效。
额外说明:array_push()本身的设计是向数组末尾追加数字索引元素,你的需求是给商品信息绑定var_price这个字符串键的关联值,这个函数本身就不适配当前场景,即便解决了遍历拷贝的问题,用array_push()写入的值也无法通过var_price键读取。
解决方案
方案1:遍历声明引用,直接操作原数组
遍历循环变量前加&声明为原数组元素的引用,即可直接在循环内修改原数组内容。注意循环结束后必须用unset()销毁引用变量,避免后续逻辑误操作引用导致原数组被异常修改。
foreach($cartitemCollection as &$cartitem){ foreach($cartitem['product'] as &$product){ $variablePrices = $variablePricesRepository->findByProductId($product['id']); $product['var_price'] = $variablePrices; } // 销毁内层循环引用 unset($product); } // 销毁外层循环引用 unset($cartitem);
方案2:通过键路径直接修改原数组,规避引用风险
如果不想处理引用带来的隐式问题,可以在遍历时同步拿到元素的键名,直接通过完整键路径定位到原数组对应位置赋值,逻辑更直观也不会出现引用相关的bug:
foreach($cartitemCollection as $cartKey => $cartitem){ foreach($cartitem['product'] as $prodKey => $product){ $variablePrices = $variablePricesRepository->findByProductId($product['id']); $cartitemCollection[$cartKey]['product'][$prodKey]['var_price'] = $variablePrices; } }
提示:嵌套遍历场景下如果要用引用,必须给每一层需要修改的遍历变量都加
&声明,只给内层/只给外层加引用都无法实现原数组修改。
内容的提问来源于stack exchange,提问作者Teodora Luca
相关产品推荐
相关产品推荐

