Подтвердить что ты не робот

Декодировать разреженный 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 Version 5.2.10-2ubuntu6.4.)

4b9b3361

Ответ 1

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

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

$mynewarray = json_decode($json, true);

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

Ответ 2

Какая версия PHP? На 5.2 следующая программа /script

$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))

Это может привести к лучшим результатам.

Ответ 3

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

$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"