我使用json_encode从AJAX处理程序代码(PHP)返回一个横幅数组-
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]
<<p> 输出/em> 但是,以下是我在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]
您是否尝试将PHP数组中的数字键转换为字符串?似乎Chrome排序int键数组(与opera相同的问题)
能否提供您实际拥有的JSON对象的格式?我敢打赌,bannersData
实际上是作为一个数组而不是作为一个对象被传输的。
浏览器遵循一个标准来从JSON字符串重新创建对象,该标准要求浏览器保持键值顺序完整。然而,对于数组来说,不是这种情况,并且在这些方面绝对没有标准。因此,浏览器对此有不同的看法。
这不是一个模糊的事实:你如何阻止Chrome和Opera排序JSON对象的索引ASC?是你问题的副本(我可能会这样投票)。
有两种解决方案:将PHP数组转换为具有键值对的对象(即使键是数字!)以保持顺序,或者理解该顺序不会在所有浏览器中保持。第一个选项不需要改变JS代码,除非你使用整数迭代循环(for (var i = 0; i < array.length; i++) {
),此时你需要迭代对象的键而不是对象本身。