но в соответствии с этим: http://www.php.net/manual/en/function.json-encode.php#94157 это не будет.
Я использую флот, поэтому мне нужно иметь массив с числовыми индексами, но я получаю следующее:
jsonp1282668482872 ( {"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}} );
так что запах задыхается. Если я var_dump массив прямо перед вызовом json_encode, он выглядит так:
array(7) { [1281830400]=> int(34910) [1281916800]=> int(45385) [1282003200]=> int(56928) [1282089600]=> int(53884) [1282176000]=> int(50262) [1281657600]=> int(45446) [1281744000]=> int(34998) }
есть идеи?
Как говорит zneak, массивы Javascript (и, следовательно, JSON) не могут иметь ключи массива вне порядка. Таким образом, вам нужно либо принять, что вы будете работать с объектами JSON, а не с массивами или вызывать array_values
перед json_encode
:
json_encode(array_values($data));
Однако похоже, что вы хотите отображать данные временных рядов с помощью флота. Как вы можете видеть на примере серии временных рядов , это должен быть массив из двух элементов:
$.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.
Напоминаем, что массив 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; }
Вы можете заставить json_decode()
создавать массивы, передавая TRUE в качестве второго параметра, но вы не можете заставить json_encode()
создавать массивы в первую очередь:
json_decode($json, TRUE); // force array creation
Вы можете использовать array_merge для переиндексации массива с числовой индексацией, например:
$a = array(2 => 3, 4 => 5); $a = array_merge($a); var_dump($a);
Для флота то, что вы просите, на самом деле не то, что вы хотите. Вам нужен массив массивов, а не массив чисел. То есть вы хотите что-то похожее на это:
[[1281830400, 34910], [1281916800, 45385], [1282003200, 56928], [1282089600, 53884], [1282176000, 50262], [1281657600, 45446], [1281744000, 34998]]
Что касается того, как это сделать в PHP, я не уверен.