使用JSON.stringify时出现不需要的数组索引

3

我使用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
)

为什么会发生这种情况?
3个回答

5
这就是 JavaScript 数组的工作原理。当你设置一个超出范围的索引值时,数组会扩展,成功设置相应的值,并将所有“缺失”的值设置为undefined
在 PHP 中,数组的行为会混淆数组和字典(或者在 PHP 中所说的“关联数组”)之间的差异,你已经被宠坏了。
要避免这种行为,只需在 JavaScript 中创建一个字典,而不是数组。
var arr = {};
arr[10] = 1;
arr[20] = 2;

此外,在 PHP 方面,你应该将 true 作为第二个参数传递给 json_decode
json_decode($arr, true)

这将使其返回数组而不是stdclass。

1
+1,不过你可能需要添加在PHP端,json_decode的第二个参数需要设置为true,否则你将得到stdclass对象,而不是数组。 - Yoshi
没错。对象和数组是两个不同的东西。不要忘记基础。 - stonyau

1
你如何初始化arr?你可能想使用对象而不是数组。例如:
var arr = {};
arr[10] = 1;
arr[20] = 1;
arr[30] = 1;
arr[30] = 1;
var jsonified = JSON.stringify(arr);
console.log(jsonified);

1

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

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

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

或者,如果你需要的不是二进制值,可以使用对象:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接