Декодировать разреженный объект 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.)

Author: Konstantin Schubert, 2010-03-20

3 answers

json_decode по умолчанию возвращает объект типа stdClass. Вы получаете доступ к элементам как к свойствам (т. Е. $result->test20). 10 не является допустимым именем для свойства, поэтому вы его теряете.

Вместо приведения к массиву, вы можете передать true в качестве второго аргумента json_decode, чтобы он возвращал сам ассоциативный массив:

$mynewarray = json_decode($json, true);

Если вы это сделаете, $mynewarray[10] будет работать нормально.

 47
Author: Chris, 2010-03-20 20:58:09

Какая версия 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))

Это может дать лучшие результаты.

 2
Author: Alan Storm, 2010-03-20 20:59:27

Проблема заключается в преобразовании объекта в массив.

$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"
 2
Author: vava, 2010-03-20 21:20:48