Я знаю, что лучше вызывать 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 и почему я должен (не) избегать типизации объектов в массивах.
Числовые ключи, которые являются допустимыми целыми числами, автоматически преобразуются в PHP как целые числа.
От руководство:
Ключ может быть целым числом или строкой. Значение может быть любого типа. … Строки, содержащие действительные целые числа, будут преобразованы в целочисленный тип. Например. ключ «8» фактически будет храниться в 8. С другой стороны, «08» не будет разыгрываться, поскольку он не является действительным десятичным целым числом.
Других решений пока нет …