Я хотел бы, чтобы json_encode в PHP возвращал массив JSON, даже если индексы не в порядке
Но в соответствии с этим: http://www.php.net/manual/en/function.json-encode.php это не так.
Я использую flot, поэтому мне нужно получить массив с числовыми индексами, но я получаю следующее:
jsonp1282668482872 ( {"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}} );
Флот задыхается. Если я изменю массив прямо перед вызовом 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)
}
есть идеи?
5 ответов
Как говорит zneak, массивы Javascript (и, следовательно, JSON) не могут иметь неупорядоченные ключи массива. Таким образом, вам нужно либо принять, что вы будете работать с объектами JSON, а не массивами, либо вызвать array_values
до json_encode
:
json_encode(array_values($data));
Тем не менее, похоже, что вы хотите отобразить данные временных рядов с помощью flot. Как вы можете видеть на примере временного ряда 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)
)
);
Это концептуально невозможно. Вы не можете кодировать массив с фиксированными индексами в 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, я не уверен.