echo $_COOKIE[$cart_cookie]; //prints "[{\"id\":1353,\"product\":\"prod23\",\"quantity\":1,\"price\":43},{\"id\":133453,\"product\":\"prod\",\"quantity\":1,\"price\":23}]"
$json_data = json_decode($_COOKIE[$cart_cookie]);
echo $json_data; // prints [{"id":1353,"product":"prod23","quantity":1,"price":43},{"id":133453,"product":"prod","quantity":1,"price":23}]
foreach ($json_data as $item) { // Warning: Invalid argument supplied for foreach()
}
有人可以建议,在PHP中迭代JSON时我错过了什么?当我得到警告:运行此代码时为foreach()提供的参数无效。
答案 0 :(得分:1)
似乎那些开头和结尾的引号都是我在这里看到的cookie json字符串的一部分。
如果是这种情况,这应该有效(在开头和结尾处首先删除报价)。
$cookie_string = stripslashes($_COOKIE[$cart_cookie]);
$cookie_string = trim($cookie_string, '"');
$json_data = json_decode($cookie_string);
foreach ($json_data as $item) {
// do stuff
}
答案 1 :(得分:1)
JSON字符串格式错误。它已被引用,其中的引号已被转义,就像addslashes
的影响一样。
您的代码未显示此篡改发生的位置,但最好将您删除原因。如果您的PHP版本低于5.4,请关闭magic_quots_gpc配置。
但鉴于目前的情况,您可以将字符串修复回有效的JSON,如下所示:
$json_data = json_decode(stripslashes(trim($_COOKIE[$cart_cookie],'"')));
因此,应用了两个函数:
trim(..., '"')
:从字符串中删除第一个和最后一个字符,即包装双引号;
stripslashes(...)
:取消在字符串中转义的内容,例如双引号。
答案 2 :(得分:0)
看起来您可能有一个无效的JSON字符串。我从echo $_COOKIE['cookie_cart']
获取了输出并将其放入JSONLint,但它无法正确解析。
您可能需要strip out the slashes first:
$json_data = json_decode(($_COOKIE[$cart_cookie]));
$products = json_decode($json_data) // confirmed that it's an array
可能会添加斜杠,因为您有magic quotes turn on。强烈建议您将其关闭,并在需要时使用转义字符串。