首先,这不是一个重复的问题。我已经看了一些类似的问题,大部分答案都是我现在正在使用的。
这是设置的问题, 在PHP方面
$array = array('name' => 'a', 'data' => array('0'=>15,'0.25'=>'18','0.35'=>19,'1' =>20));
echo json_encode($array);
JS方面的
data = $ .parseJSON(data); // data是从php脚本返回的 上述
正如您所看到的,$ array ['data']是一个关联数组,其数字编号为其键并按顺序排序。在解析为JSON时,javascript改变了该数组的顺序,并将0和1排序为数字键,并将它们放在对象的头部。
我知道这是某些浏览器的标准行为,例如chrome和IE9。 我已经阅读过某些地方,如果我想保持数组的顺序,人们建议严格坚持使用数组。 但我的问题是你如何将数组从PHP反馈到javascript作为数组而不是使用json对象?或者是否有其他解决方案可以解决这类问题。感谢提前输入。
感谢提前输入
答案 0 :(得分:3)
使用数组维护顺序,然后使用对象创建地图。有两种方法。我建议:
$array = array('name' => 'a', 'data' =>
array(
array('key' => 0, 'value' => 15),
array('key' => 0.25, 'value' => 18),
array('key' => 0.35, 'value' => 19),
array('key' => 1, 'value' => 20),
)
);
echo json_encode($array);
哪个会给你JSON:
{
"name": "a",
"data": [
{"key": 0, "value": 15},
{"key": 0.25, "value": 18},
{"key": 0.35, "value": 19},
{"key": 1, "value": 20}
]
}
然后你会有订单,但查找某个密钥会更困难。如果您希望这很容易,您可以返回一个映射对象,如下所示:
$array = array('name' => 'a', 'data' =>
array(
"0" => 15,
"0.25" => 18,
"0.35" => 19,
"1" => 20,
),
'order' => array("0", "0.25", "0.35", "1")
);
echo json_encode($array);
哪个会给你:
{
"name": "a",
"data": {
"0": 15,
"0.25": 18,
"0.35": 19,
"1": 20
},
"order": ["0", "0.25", "0.35", "1"]
}
这两种返回数据的方法之一应该证明对您的特定用例最有用。
答案 1 :(得分:0)
实际上,它是PHP,它使用"0"
和"1"
键并使它们成为数字键。这与您的JavaScript无关。
没有任何真正的方法可以解决这个问题,但理想情况下,您的代码不应该依赖于“对象的键的顺序”等内容。从我在这里看到的,将数据分成键数组和值数组,然后在JS端将它们一起拉回来可能是一个更好的主意。
答案 2 :(得分:0)
我建议另一个存储订单的字段。
$array = array('name' => 'a',
'data' => array('0'=>15,'0.25'=>'18','0.35'=>19,'1' =>20),
'order'=> '0,0.25,0.35,1'
);
echo json_encode($array);