【问题标题】:Unwanted array indexes when using JSON.stringify使用 JSON.stringify 时不需要的数组索引
【发布时间】:2012-02-11 09:04:27
【问题描述】:

我使用JSON.stringify 方法将数组传递给服务器。

我有一个包含 4 个元素的数组:

arr[10] = 1;
arr[20] = 1;
arr[30] = 1;
arr[40] = 1;

然后我这样做:

arr = JSON.stringify(arr);

然后发送到服务器:

                jQuery.ajax({
                    type: "post",
                    url: baseurl+"profile/mprofile/action/ratings/add_ratings",
                    data:{"checkbox":checkbox,"review":review,"speciality":speciality,"arr":arr},
                    success: function(data, status) {  

                        jQuery('#header-error').html(data);
                    } 
                }); 

我在 PHP 中获取数组:

    $arr = $this->ci->input->post('arr');
    $arr = json_decode($arr);
    print_r($arr) ; die ;

结果是

Array
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 
    [10] => 1
    [11] => 
    [12] => 
    [13] => 
    [14] => 
    [15] => 
    [16] => 
    [17] => 
    [18] => 
    [19] => 
    [20] => 1
    [21] => 
    [22] => 
    [23] => 
    [24] => 
    [25] => 
    [26] => 
    [27] => 
    [28] => 
    [29] => 
    [30] => 1
    [31] => 
    [32] => 
    [33] => 
    [34] => 
    [35] => 
    [36] => 
    [37] => 
    [38] => 
    [39] => 
    [40] => 1
)

为什么会这样?

【问题讨论】:

    标签: php javascript jquery ajax arrays


    【解决方案1】:

    这就是 javascript 数组的工作方式。当您将值设置为超出范围的索引时,数组会展开,值会成功设置,并且所有“缺失”值都会设置为 undefined

    您被混合了数组和字典(或“关联数组”,在 PHP 谈话中)之间的差异的 PHP 行为宠坏了。

    为避免这种行为,只需在 javascript 中创建字典而不是数组。

    var arr = {};
    arr[10] = 1;
    arr[20] = 2;
    

    此外,在 PHP 方面,您应该将 true 作为第二个参数传递给 json_decode

    json_decode($arr, true)
    

    这将使它返回数组而不是标准类。

    【讨论】:

    • +1,尽管您可能想在 php 端添加,需要将 json_decode 的第二个参数设置为 true,否则您最终会得到 stdclass 对象而不是数组。跨度>
    • 确实如此。对象和数组是两个不同的东西。不要忘记基础知识。
    【解决方案2】:

    你如何初始化arr?您可能想要使用对象而不是数组。例如:

    var arr = {};
    arr[10] = 1;
    arr[20] = 1;
    arr[30] = 1;
    arr[30] = 1;
    var jsonified = JSON.stringify(arr);
    console.log(jsonified);
    

    【讨论】:

      【解决方案3】:

      JavaScript 中的数组的工作方式与 PHP 中的有些不同。您实际上并没有一个包含 4 个元素的数组,而是一个包含 41 个元素的数组从一开始就。例如,当您说arr[ 10 ] = 1 时,0 到 9 之间的每个数组元素都会自动分配为undefined

      我建议你换个逻辑:不要使用数组键来跟踪值,而是使用数组值:

      arr = [ 10, 20, 30, 40 ];
      

      或者,如果您需要二进制值以外的值,请使用对象:

      arr = [
          { score: 10, value: 1 },
          { score: 20, value: 5 }
      ];
      

      【讨论】:

        猜你喜欢
        • 2014-10-14
        • 1970-01-01
        • 2017-10-13
        • 1970-01-01
        • 2015-08-09
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        相关资源
        最近更新 更多