Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP将数组作为数组而不是JSON传递给javascript_Php_Javascript_Arrays_Json - Fatal编程技术网

从PHP将数组作为数组而不是JSON传递给javascript

从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

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

这是设置的问题, 在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。 我在某个地方读到,如果我想保持数组的顺序,人们建议严格使用数组。 但我的问题是,如何将数组作为数组而不是使用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的函数一样透明,但您确实给了我一些好主意从这里开始。谢谢