在php中迭代JSON对象

时间:2016-07-17 08:10:44

标签: php json

   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()提供的参数无效。

3 个答案:

答案 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。强烈建议您将其关闭,并在需要时使用转义字符串。