使用 & 获取为 foreach() 提供的无效参数

Getting Invalid argument supplied for foreach() by using &

我正在尝试重新编辑 cookie 值。

当我不使用 &$prod 时,它不会更改数组值。

当我使用 &$prod 时,它改变了数组但我得到:

Invalid argument supplied for foreach()

是否有任何其他方法可以更新现有数组,或者为什么我会收到此错误?

$existingCookie = Cookie::get($cookie);
$arr = json_decode($existingCookie, true);
foreach ($arr as &$prod) {
    if($productId === $prod["pid"]) {
        if($prod["pqty"]!=$productQty){
            $prod["pqty"] = $productQty;
            $arr = json_encode($arr);
            Cookie::put($cookie, $arr, Config::get('cart/cookie_expiry'));
            echo var_dump($arr) . ' - '.$prod["pqty"];
        }
    }
}

我想你想修复整个 $arr 然后在循环之后,只更新一次 cookie。这种逻辑上直接的方法也消除了错误。

您收到错误的原因是因为您在 foreach 表达式中使用 & 并在循环中写入 $arr = json_encode($arr);。循环不是迭代输入数组的 "copy"(默认情况下),而是迭代输入数组本身,因为 &$prod。满足这两个条件后,$arr 被转换为 json 字符串并且 foreach 循环在其上阻塞。

$arr=json_decode(Cookie::get($cookie), true);
foreach($arr as &$prod){
    if($prod["pid"]===$productId && $prod["pqty"]!==$productQty){
        $prod["pqty"]=$productQty;
    }
}
Cookie::put($cookie, json_encode($arr), Config::get('cart/cookie_expiry'));