【问题标题】:Pass array to javascript as array not JSON from PHP将数组作为数组而不是来自 PHP 的 JSON 传递给 javascript
【发布时间】:2012-06-10 00:10:53
【问题描述】:

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

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

感谢您提前输入

【问题讨论】:

  • Afaik,JSON 解析器在解码时不保证任何顺序,您需要使用另一个字段(或数组)来保留您的顺序,使用键不起作用。

标签: php javascript arrays json


【解决方案1】:

使用数组来维护顺序,然后使用对象来创建地图。有两种方法。我建议:

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

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

【讨论】:

  • 感谢您的建议,这肯定会成功。我最终将 javascript 中的 $array['data'] 提取到那里的数组中并对其进行了排序。我会尝试你的建议,看看哪个会更自然地融入我现在使用的代码。整个 JSON 对象是 JS 在 web 前端绘制图形的对象,所以我必须让它对调用对象的函数一样透明:x 但你确实给了我一些从那里开始的好主意。谢谢!
【解决方案2】:

实际上,是 PHP 采用了 "0""1" 键并使其成为数字键。这与您的 JavaScript 无关。

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

【讨论】:

    【解决方案3】:

    我建议使用另一个字段来存储订单。

    $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);
    

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2011-05-16
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多