11

但据此: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)
}

有任何想法吗?

4

5 回答 5

31

正如 zneak 所说,Javascript(以及 JSON)数组不能有乱序数组键。因此,您要么需要接受您将使用 JSON 对象,而不是数组,要么需要调用array_valuesbefore json_encode

json_encode(array_values($data));

但是,您似乎希望使用 float 显示时间序列数据。正如您在flot 时间序列示例中看到的那样,它应该是一个二元素数组,如下所示:

$.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)
  )
);
于 2010-08-24T18:38:59.557 回答
8

这在概念上是不可能的。您不能在 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;
}
于 2010-08-24T18:28:06.940 回答
5

您可以json_decode()通过将 TRUE 作为第二个参数传递来强制生成数组,但您不能一开始就强制json_encode()生成数组:

json_decode($json, TRUE); // force array creation
于 2010-08-24T18:37:38.903 回答
0

您可以使用 array_merge 重新索引数字索引数组,如下所示:

$a = array(2 => 3, 4 => 5);
$a = array_merge($a);
var_dump($a);
于 2010-08-24T18:31:51.640 回答
0

对于flot,您所要求的实际上并不是您想要的。你想要一个数组数组,而不是一个数字数组。也就是说,你想要看起来像这样的东西:

  [[1281830400, 34910],
   [1281916800, 45385],
   [1282003200, 56928],
   [1282089600, 53884],
   [1282176000, 50262],
   [1281657600, 45446],
   [1281744000, 34998]]

至于如何在 PHP 中做到这一点,我不确定。

于 2010-08-24T18:39:38.090 回答