我使用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
)
为什么会这样?
答案 0 :(得分: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)
你如何初始化arr?您可能希望使用对象而不是Array。例如:
var arr = {};
arr[10] = 1;
arr[20] = 1;
arr[30] = 1;
arr[30] = 1;
var jsonified = JSON.stringify(arr);
console.log(jsonified);
答案 2 :(得分: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 }
];