2

首先这不是重复的问题。我已经查看了一些类似的问题,大部分答案都是我现在正在使用的。

这是在PHP方面设置的问题

$array = array('name' => 'a', 'data' => array('0'=>15,'0.25'=>'18','0.35'=>19,'1' =>20));
echo json_encode($array);

在 JS 方面

数据 = $.parseJSON(数据); // 数据是上面 php 脚本的返回值

如您所见, $array['data'] 是一个关联数组,以数字为键并按顺序排序。在解析为 JSON 时,javascript 更改了该数组的顺序并将 0 和 1 排序为数字键并将它们放在对象的头部。

我知道这是某些浏览器(例如 chrome 和 IE9)的标准行为。如果我想保持数组的顺序,我已经读过人们建议严格坚持使用数组的地方。但我的问题是你如何将一个数组从 PHP 反馈到 javascript 作为一个数组而不是使用 json 对象?或者是否有其他解决此类问题的方法。感谢您提前输入。

感谢您提前输入

4

3 回答 3

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"]
}

这两种返回数据的方法之一应该被证明对您的特定用例最有用。

于 2012-06-05T23:39:09.423 回答
0

实际上,是 PHP 采用"0"and"1"键并将它们变成数字键。这与您的 JavaScript 无关。

没有任何真正的方法可以解决这个问题,但理想情况下,您的代码不应依赖于诸如“对象的键的顺序”之类的东西。就我在这里看到的情况而言,将数据分成一个键数组和一个值数组,然后在 JS 端将它们重新压缩在一起,这可能是一个更好的主意。

于 2012-06-05T23:39:34.733 回答
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);
于 2012-06-05T23:40:10.730 回答