array_key_exists после преобразования из stdClass

Я знаю, что лучше вызывать json_decode со вторым аргументом как true, если я хочу иметь JSON в качестве массива, но PHP разрешает приведение типов stdClass в array, а затем эта проблема происходит:

<?php
$array = (array) json_decode('{"1":"1","2":"1","3":"1","4":"1","12":"1"}');
var_dump($array);
var_dump(array_key_exists('12', $array));

И результат будет:

array(5) {
["1"]=>
string(1) "1"["2"]=>
string(1) "1"["3"]=>
string(1) "1"["4"]=>
string(1) "1"["12"]=>
string(1) "1"}
bool(false)

Также, когда я пытаюсь сделать:

$array['12'] = 'X';

’12’ будет типизировано по отношению к INT, поэтому у меня будут ключи 12 и ’12’ в массиве при var_dumping. Кто-нибудь знает почему?


Пожалуйста, не говорите, что мне нужно использовать json_decode(..., true) — Я действительно знаю и понимаю это, я просто хочу знать, что здесь происходит, чтобы лучше понять, как работает PHP и почему я должен (не) избегать типизации объектов в массивах.

1

Решение

Числовые ключи, которые являются допустимыми целыми числами, автоматически преобразуются в PHP как целые числа.

От руководство:

Ключ может быть целым числом или строкой. Значение может быть любого типа. … Строки, содержащие действительные целые числа, будут преобразованы в целочисленный тип. Например. ключ «8» фактически будет храниться в 8. С другой стороны, «08» не будет разыгрываться, поскольку он не является действительным десятичным целым числом.

0

Другие решения

Других решений пока нет …