但根据这个:http://www.php.net/manual/en/function.json-encode.php#94157它不会。
我正在使用flot所以我需要一个带有数字索引的数组,但我得到的是:
jsonp1282668482872 ( {"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}} );
所以flot很窒息。如果我在调用json_encode之前var_dump数组,它看起来像这样:
array(7) {
[1281830400]=>
int(34910)
[1281916800]=>
int(45385)
[1282003200]=>
int(56928)
[1282089600]=>
int(53884)
[1282176000]=>
int(50262)
[1281657600]=>
int(45446)
[1281744000]=>
int(34998)
}
任何想法?
答案 0 :(得分:29)
正如zneak所说,Javascript(以及JSON)数组不能具有无序数组键。因此,您需要接受您将使用JSON对象而不是数组,或者在array_values
之前调用json_encode
:
json_encode(array_values($data));
但是,看起来您正在寻找使用flot显示时间序列数据。正如您在flot time series example上看到的那样,它应该是一个两元素数组,如下所示:
$.plot(
$('#placeholder'),
[[
[1281830400, 34910],
[1281916800, 45385],
[1282003200, 56928],
[1282089600, 53884],
[1282176000, 50262],
[1281657600, 45446],
[1281744000, 34998]
]],
{
label: 'Hits 2010-08-20',
xaxis: {mode: 'time'}
}
)
鉴于你的数组(我们称之为$data
),我们可以得到正确的JSON:
json_encode(
array_map(
function($key, $value) { return array($key, $value); },
array_keys($data),
array_values($data)
)
);
答案 1 :(得分:7)
这在概念上是不可能的。您不能使用JSON中的固定索引编码数组。
提醒一下,JSON数组如下所示:
[1, 2, 3, 4, 5]
没有空间把指数放在那里。
你应该在Javascript方面工作。接受json_encode
将返回一个对象,您可以将此对象转换为数组。这不应该太难。
function toArray(object)
{
var result = [];
for (var key in object)
{
if (!key.match(/^[0-9]+$/)) throw new Error("Key must be all numeric");
result[parseInt(key)] = object[key];
}
return result;
}
答案 2 :(得分:5)
您可以通过传递TRUE作为第二个参数来强制json_decode()
生成数组,但是您不能强制json_encode()
首先生成数组:
json_decode($json, TRUE); // force array creation
答案 3 :(得分:0)
您可以使用array_merge重新索引数字索引数组,如下所示:
$a = array(2 => 3, 4 => 5);
$a = array_merge($a);
var_dump($a);
答案 4 :(得分:0)
对于flot来说,你所要求的并不是你想要的。您需要一个数组数组,而不是数组数组。也就是说,你想要的东西看起来像这样:
[[1281830400, 34910],
[1281916800, 45385],
[1282003200, 56928],
[1282089600, 53884],
[1282176000, 50262],
[1281657600, 45446],
[1281744000, 34998]]
至于如何在PHP中这样做,我不确定。