Декодируйте редкий объект 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 функции?

(Я использую 5.2.10-2ubuntu6.4 Версию PHP.)

22
задан Konstantin Schubert 10 November 2012 в 10:28
поделиться

3 ответа

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

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

$mynewarray = json_decode($json, true);

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

47
ответ дан 29 November 2019 в 04:12
поделиться

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

$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"
2
ответ дан 29 November 2019 в 04:12
поделиться

Какая версия 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
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: