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));

ただし、時系列データをflotで表示しようとしているようです。flot time series exampleでわかるように、次のような 2 つの要素の配列である必要があります。

$.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

2 番目のパラメーターとして TRUE を渡すことで配列を強制的に生成することはできますが、最初から配列をjson_decode()強制的に生成することはできません。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 に答える