Декодировать разреженный объект json в массив php
Я могу создать разреженный массив 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
функции?
(Я использую PHP версии 5.2.10-2ubuntu6.4.)
3 answers
json_decode
по умолчанию возвращает объект типа stdClass. Вы получаете доступ к элементам как к свойствам (т. Е. $result->test20
). 10
не является допустимым именем для свойства, поэтому вы его теряете.
Вместо приведения к массиву, вы можете передать true
в качестве второго аргумента json_decode
, чтобы он возвращал сам ассоциативный массив:
$mynewarray = json_decode($json, true);
Если вы это сделаете, $mynewarray[10]
будет работать нормально.
Какая версия 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))
Это может дать лучшие результаты.
Проблема заключается в преобразовании объекта в массив.
$a = (array)json_decode('{"10":"hi","test20":"howdy"}');
var_dump($a);
//outputs
array(2) {
["10"]=>
string(2) "hi"
["test20"]=>
string(5) "howdy"
}
Смотрите, как у этого массива есть индекс "10"
? Но в PHP все, что выглядит как число, преобразуется в число, особенно в индексах массива. Вы не можете просто получить a["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"