Я могу создать редкий массив php (или карта) использование команды:
$myarray = array(10=>'hi','test20'=>'howdy');
Я хочу сериализировать/десериализовать это как JSON. Я могу сериализировать его с помощью команды:
$json = json_encode($myarray);
который приводит к строке {"10":"hi","test20":"howdy"}
. Однако, когда я десериализовываю это и бросаю его к массиву с помощью команды:
$mynewarray = (array)json_decode($json);
Я, кажется, теряю любые отображения с ключами, которые не были допустимыми php идентификаторами. Таким образом, mynewarray
имеет отображение 'test20'=>'howdy'
, но нет 10=>'hi'
ни '10'=>'hi'
.
Есть ли способ сохранить числовые ключи в карте php при преобразовании в и назад от json использование стандарта json_encode
/ json_decode
функции?
(Я использую 5.2.10-2ubuntu6.4 Версию PHP.)
json_decode
по умолчанию возвращает объект типа stdClass. Вы получаете доступ к членам как к свойствам (например, $result->test20
). 10
не является допустимым именем для свойства, поэтому вы его теряете.
Вместо приведения к массиву вы можете передать true
в качестве второго аргумента в json_decode
, чтобы он сам возвращал ассоциативный массив:
$mynewarray = json_decode($json, true);
Если вы это сделаете, $mynewarray[10]
будет работать нормально.
Проблема заключается в преобразовании объекта в массив.
$a = (array)json_decode('{"10":"hi","test20":"howdy"}');
var_dump($a);
//outputs
array(2) {
["10"]=>
string(2) "hi"
["test20"]=>
string(5) "howdy"
}
Видите, как этот массив имеет индекс "10"
? Но в PHP все, что выглядит как число, преобразуется в число, особенно в индексах массива. Вы не можете просто получить ["10"]
, потому что он преобразует "10"
в число, а этот массив не имеет такого индекса.
Однако foreach
работает.
foreach ($a as $key => $value) {
var_dump($key);
var_dump($value);
}
//outputs
string(2) "10"
string(2) "hi"
string(6) "test20"
string(5) "howdy"
Вы также можете рассматривать результат json_decode как объект. Хотя вы не сможете выполнить $ a-> 10
или $ a -> "10"
,
$a = json_decode('{"10":"hi","test20":"howdy"}');
$b = 10;
var_dump($a->$b);
//outputs
string(2) "hi"
работает.
Но, скорее всего, как сказал Крис, вы просто хотите передать true
в качестве второго аргумента.
$a = json_decode('{"10":"hi","test20":"howdy"}', true);
var_dump($a[10]);
//outputs
string(2) "hi"
Какая версия PHP? В версии 5.2 следующая программа / сценарий
$myarray = array(10=>'hi','test20'=>'howdy');
$json = json_encode($myarray);
$mynewarray = (array) json_decode($json);
var_dump($mynewarray);
выводит
array(2) {
["10"]=>
string(2) "hi"
["test20"]=>
string(5) "howdy"
}
, который не отображает описываемое вами поведение.
Тем не менее, если ваша версия PHP неверно передает JSON, попробуйте использовать get_object_vars для объекта stdClass, который возвращает json_decode
get_object_vars(json_decode($json))
Это может дать лучшие результаты.