Я бы хотел, чтобы json_encode в PHP возвращал массив JSON, даже если индексы не в порядке

но в соответствии с этим: 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, я не уверен.