在php中解压缩json

时间:2018-02-14 15:43:26

标签: php json foreach

我试图通过php控制器中的http post请求解压缩我的json对象:

        $products = $_POST['products'] ?? '';

        foreach($products as $purchase){
        $productId =$purchase['productid'];
        $qty = $purchase['quantity'];
        $params = array(
                      'form_key' => $this->formKey->getFormKey(),
                      'product' => $productId,
                      'qty'   => $qty
                  );
          //Load the product based on productID
          $_product = $this->product->load($productId);
          $this->cart->addProduct($_product, $params);
          $this->cart->save();
      }

这是我发送的json对象的格式,存储在名为list的变量中。

0: {productid: "2910", quantity: "2"}
1: {productid: "2911", quantity: "1"}
2: {productid: "2913", quantity: "4"}
3: {productid: "2914", quantity: "3"}

这是我的帖子请求(内容类型也设置为application/json):

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      products:list,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });

这对我来说一直很有用,所以我无法看到我在哪里出错。

我得到的错误是Warning: Invalid argument supplied for foreach()。但我认为它与我的json对象有关。

编辑:

$("#AddToCartButton").click(function(){
   var list = [];
   $("#tabCollection :input").each(function(){
   var input = $(this);
    if($(this)[0].value > 0){
      var myArray = {'productid': $(this)[0].id, 'quantity': $(this)[0].value};
      list.push(myArray);
    }
   });
   var JSONStringlist = JSON.stringify(list);
   var JSONlist = JSON.parse(JSONStringlist);
   console.log(JSONlist);

   $.ajaxSetup({
      headers:{
       'Content-Type': "application/json",
      }
   });

   $.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

编辑2:

JSON字符串的示例:

[{"productid":"2182","quantity":"1"},{"productid":"2183","quantity":"1"},{"productid":"2184","quantity":"1"},{"productid":"2185","quantity":"1"}]

1 个答案:

答案 0 :(得分:0)

    $products = $_POST['products'] ?? '';

    foreach($products as $purchase){

您的$ products是“可迭代的东西”或空字符串。

如果它是一个数组,它是可迭代的,并且foreach将成功执行。但是如果它是一个空字符串,它会抱怨“警告:为foreach()提供的参数无效”,导致字符串不能真正迭代。

所以你需要做的就是确保$ products总是一个数组,无论是空的还是填充了json对象。

如果你改变:

$products = $_POST['products'] ?? '';

为:

$products = json_decode($_POST['products']) ?? array();

foreach不会抱怨,如果$ _POST ['products']为空,则不会在购物车中保存任何内容。

在您的javascript文件中更改:

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

到:

$.post("http://dev.website.co.uk/batchorder/index/addtocart",
    {
      "products":JSONStringlist,
    },
    function(data, status){
      console.log("Data: " + data);
      console.log("Status: " + status);
    });
  });

您正在将JavaScript对象解析为JSON,然后将其重新解析为JavaScript对象。

PHP并不真正了解JavaScript对象,但了解JSON对象。