为什么PHP json_encode忽略空数组?

时间:2016-05-18 09:01:48

标签: javascript php arrays json

我有以下javascript将数据发送到PHP函数:

<script>
    var mydata = {
                   id:123,
                   name: 'mike',
                   orders: []
    };

    $.ajax({
       type: 'POST',
       url:  'test.php',
       data: {save_data:mydata},
       success: function(data) {
                   alert('php received: ' + data);
       }
    });
</script>

和我的test.php文件包含以下代码:

<?php
     if (isset($_POST['save_data'])) {
          $json = json_encode($_POST['save_data']);
          echo $json;     // just to check what has been received
          exit();
     }
?>

我期望从PHP收到的是: {"id":"123","name":"mike","orders":"[]"}

我得到的是{"id":"123","name":"mike"}

请注意,orders数组已从输出中删除。没有地方持有人。我尝试在数组中添加一些虚拟元素,并且工作正常,然后我收到了带有元素的数组。

我需要PHP按原样接收json对象,即使它包含空数组。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

JSON对象是在PHP中创建的。在此之前,您只需拥有表单数据。

jQuery将以PHP友好的方式对表单数据进行编码。

如果你给它:

data: { foo: [1, 2, 3] }

它会将其转换为:

foo[]=1&foo[]=2&foo[]=3

(虽然它会对[])进行百分比编码

您获得每个值的键值=值

如果您有一个空数组,那么您没有任何值,因此您不会获得任何键=值对。

没有办法编码&#34;一个空数组&#34;使用PHP对表单url编码语法的扩展。

您有两个基本选项:

  1. 告诉PHP您要提前创建的数据结构,并填写空数组。
  2. 在客户端上生成JSON

答案 1 :(得分:0)

这不是PHP的错误。它导致Jquery在将其发送到服务器时将igrone为空数组。因此,您必须在发送

之前将'orders'键中的数组解析为字符串JSON
var mydata = {
               id:123,
               name: 'mike',
               orders: []
};

更改为

var mydata = {
               id:123,
               name: 'mike',
               orders: JSON.stringify([])
};