【问题标题】:Getting Invalid argument supplied for foreach() by using &使用 & 获取为 foreach() 提供的无效参数
【发布时间】:2018-08-02 21:27:04
【问题描述】:

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

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

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

为 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"];
        }
    }
}

【问题讨论】:

  • print_r($arr)开头
  • 您正在循环期间修改 $arr 数组。这是完全错误的......
  • @u_mulder 数组([0] => 数组([pid] => 2 [pqty] => 3))
  • 上一条评论解释了问题所在。阅读它。

标签: php loops cookies pass-by-reference


【解决方案1】:

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

您收到错误的原因是因为您在 foreach 表达式中使用 & 并在循环中写入 $arr = json_encode($arr);。由于&$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'));

【讨论】:

  • 这是正确的@u_mulder 吗?我不认为我明白你在说什么(这剥夺了我的信心)
  • 我已经做到了,但谢谢。它不是一个循环,还有更多的父循环,为什么我不应该通过循环更新数组?
  • @Stupid 我的回答仍然会在foreach() 上产生错误?我认为有些事情你没有告诉我们。
  • @Stupid 如果我的回答不能解决问题,我们将需要查看更多代码。如果您有更多循环,您确定我们正在处理正确的循环吗?请发布更多您的代码。
  • 我通过 ajax 作为数组发送 post 数据,我在数组中循环使用 post 数据数组中的新值更改现有 cookie 数组。如果这有任何意义。我的代码工作得很好,它改变了数组,但除此之外我得到了错误。根据您的回答,它会做同样的事情而不会出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2011-02-07
相关资源
最近更新 更多