我使用AJAX处理程序代码(PHP)中的json_encode返回一个横幅数组 -
echo json_encode(array("bannersData" =>$bannersData));
当数据被回显时,数据的顺序是正确的。
但是,在AJAX响应处理代码(javascript部分)中,我在chrome版本26.0.1410.64 m中获得了对返回对象的不同排序(按照标题ID排序)。我不确定我们是否有任何选择来强制保持原始排序顺序不变。
以下是代码 -
$.ajax({
type: "POST",
async: false,
url: posturl,
data:postdata,
dataType: "json",
success: function(msg){
if($.isEmptyObject(msg.bannersData))
{
bannerOptionsHtml = "No Banner available";
}
else
{
/*getting unexpectedly sorted result here*/
}
});
示例数据
输入
当我echo json_encode()
时,以下是数据的原始排序 -
'fggd' [12658]
banner 2 [12653]
Copy 2 of banner 1 [12655]
Copy 3 of banner 1 [12656]
Copy 4 of banner 1 [12657]
sdfds = 'xyz' [12654]
输出
但是,以下是我在AJAX响应中得到的结果 -
在chrome中(根据横幅ID进行排序,似乎 - 下面的R.H.S.列是横幅ID)
Test [12652]
banner 2 [12653]
sdfds = 'xyz' [12654]
Copy 2 of banner 1 [12655]
Copy 3 of banner 1 [12656]
Copy 4 of banner 1 [12657]
'fggd' [12658]
在firefox中(正如预期的那样)
'fggd' [12658]
banner 2 [12653]
Copy 2 of banner 1 [12655]
Copy 3 of banner 1 [12656]
Copy 4 of banner 1 [12657]
sdfds = 'xyz' [12654]
答案 0 :(得分:0)
您是否尝试将数字键转换为PHP数组中的String? 似乎Chrome排序了int keys数组(与opera相同的问题)
答案 1 :(得分:0)
您能提供实际拥有的JSON对象的格式吗?我打赌1英镑bannersData
实际上是作为一个数组传输而不是作为对象。
浏览器遵循从JSON字符串重新创建对象的标准,此标准命令浏览器保持键值顺序不变。但是,不是数组的情况,并且绝对没有标准。因此,浏览者对此有所不同。
这不是一个模糊的事实:How do you stop Chrome and Opera sorting JSON objects by Index ASC?是你问题的副本(我可能会这样投票)。
两个解决方案:将您的数组从PHP转换为具有键值对的对象(即使键是数字!)以保持顺序,或者理解订单不会保留在所有浏览器中。第一个选项不需要JS代码更改,除非您使用整数迭代循环(for (var i = 0; i < array.length; i++) {
,此时您需要迭代对象的键而不是对象本身。