我希望 PHP 中的 json_encode 返回一个 JSON 数组,即使索引不正确
Posted
技术标签:
【中文标题】我希望 PHP 中的 json_encode 返回一个 JSON 数组,即使索引不正确【英文标题】:I would like json_encode in PHP to return a JSON array even if the indices are not in order 【发布时间】:2011-04-03 08:21:33 【问题描述】:但根据这个: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 );
所以弗洛特窒息了。如果我在调用 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)
有什么想法吗?
【问题讨论】:
相关问题是***.com/questions/11195692/… 【参考方案1】:正如 zneak 所说,javascript(以及 JSON)数组不能有乱序的数组键。因此,您要么需要接受将使用 JSON 对象而不是数组,要么在 json_encode
之前调用 array_values
:
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)
)
);
【讨论】:
太好了,我通过循环生成 JSON 实现了相同的结果,但我更喜欢您的解决方案。谢谢! 很高兴为您提供帮助。如果您认为它回答了您的问题,请将其标记为答案。 在 Google 搜索 6 小时后,您已经解决了我的问题,即让正确的 JSON 准备好在 FLOT 中绘制图形。谢谢!【参考方案2】:这在概念上是不可能的。您不能在 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;
【讨论】:
我认为,如果 OP 可以控制数组,则将数组固定在 PHP 大小上会更有意义,这听起来像是他们所做的。一方面,它应该稍微快一点,并且会导致(几乎)更少的数据发送到客户端。 @pr1001:如果这样做,您将丢失所有关键信息。由于键是时间戳,我相信它们很重要。 我同意,但正如我和 pkh 发布的那样,我认为他首先错误地理解了他需要的数组格式。【参考方案3】:您可以通过将 TRUE 作为第二个参数传递来强制 json_decode()
生成数组,但您不能首先强制 json_encode()
生成数组:
json_decode($json, TRUE); // force array creation
【讨论】:
【参考方案4】:您可以使用 array_merge 重新索引数字索引数组,如下所示:
$a = array(2 => 3, 4 => 5);
$a = array_merge($a);
var_dump($a);
【讨论】:
他会丢失钥匙,而钥匙似乎很重要。 在这种情况下他需要一个 JSON 对象,数组不会这样做。【参考方案5】:对于 flot,您所要求的实际上并不是您想要的。你想要一个数组数组,而不是一个数字数组。也就是说,你想要这样的东西:
[[1281830400, 34910],
[1281916800, 45385],
[1282003200, 56928],
[1282089600, 53884],
[1282176000, 50262],
[1281657600, 45446],
[1281744000, 34998]]
至于如何在 PHP 中做到这一点,我不确定。
【讨论】:
以上是关于我希望 PHP 中的 json_encode 返回一个 JSON 数组,即使索引不正确的主要内容,如果未能解决你的问题,请参考以下文章
当php中的数组为空时,json_encode函数不返回大括号