从PHP将数组作为数组而不是JSON传递给javascript
首先,这不是一个重复的问题。我看过一些类似的问题,大部分答案都是我现在正在使用的 这是设置的问题, 在PHP方面从PHP将数组作为数组而不是JSON传递给javascript,php,javascript,arrays,json,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方面 数据=$.parseJSON(数据);//数据是从php脚本返回的 在上面 正如您所看到的,$array
$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。
我在某个地方读到,如果我想保持数组的顺序,人们建议严格使用数组。
但我的问题是,如何将数组作为数组而不是使用json对象从PHP反馈到javascript?或者有没有其他解决这类问题的方法。提前感谢您的输入
感谢您提前输入使用数组来维持秩序,然后使用对象来创建地图。有两种方法。我建议:
$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"]
}
这两种返回数据的方法中的一种对于您的特定用例应该是最有用的。实际上,是PHP使用了
“0”
和“1”
键,并将它们设置为数字键。这与您的JavaScript无关
没有任何真正的方法可以解决这个问题,但理想情况下,您的代码不应该依赖于诸如“对象的键的顺序”之类的东西。从我在这里看到的情况来看,将数据分离为一个键数组和一个值数组,然后在JS端将它们压缩到一起可能是一个更好的主意。我建议使用另一个字段来存储顺序
$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);
恕我直言,JSON解析器在解码时不能保证任何顺序,您需要使用另一个字段(或数组)来保持顺序,使用键是行不通的。谢谢您的建议,这肯定会奏效。最后,我在javascript中将$array['data']提取到一个数组中,并对其进行排序。我会尝试你的建议,看看哪一个会更自然地融入到我现在使用的代码中。整个JSON对象是一个用于通过JS在web前端绘制图形的对象,因此我必须使其与调用该对象来绘制:x的函数一样透明,但您确实给了我一些好主意从这里开始。谢谢