将数组传递给javascript作为数组而不是来自PHP的JSON

时间:2012-06-05 23:33:26

标签: php javascript arrays json

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

这是设置的问题, 在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对象?或者是否有其他解决方案可以解决这类问题。感谢提前输入。

感谢提前输入

3 个答案:

答案 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);