Элемент массива доступа, индексированный с помощью числовой строки

Я столкнулся с чем-то странным.

У меня есть php-массив, индексированный цифровыми клавишами. Однако невозможно получить доступ к любому из элементов, потому что php автоматически обрабатывает числовые строки как целые числа, вызывая уведомление о недопустимом смещении.

В обычных условиях его невозможно создать массив php с числовыми индексами строк, но это может произойти с типом casting.

Воспроизведение:

$object = new stdClass(); $object->{'1'} = 'one'; $array = (array) $object; var_dump($array); /* produces array(1) { ["1"]=> string(3) "one" } */ //none of the following will work $key = '1'; echo $array[1], $array['1'], $array["1"], $array[(string)1], $array[$key]; 

Это просто ошибка края? Я только столкнулся с проблемой при попытке улучшить свой ответ для другого вопроса SO

Пример живого кода: http://codepad.viper-7.com/dFSlH1

Невероятно, но это нормальное поведение в php, оно считалось ошибкой ( ссылкой ) в 2008 году.

Но они просто указали на руководство для броска с (array) :

Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта. Ключи – это имена переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны ;

Вместо этого вы можете использовать get_object_vars () :

 $object = new stdClass(); $object->{'1'} = 'one'; $array = get_object_vars( $object ); $key = '1'; echo $array[1]."<br>"; echo $array['1']."<br>"; echo $array["1"]."<br>"; echo $array[(string)1]."<br>"; echo $array[$key]."<br>"; 

Не объясняет, почему это происходит, но является решением, чтобы избежать проблемы с литой.

Off, но я подумал, может быть, это интересно. Обнаружено это в руководстве .

Чтобы избежать подобных проблем, всегда используйте целое число ИЛИ строку как индекс, не смешивайте его и не используйте целые числа в строке.

Пример смешанного массива:

 $array = array( 1 => "a", "1" => "b",//overrides 1 1.5 => "c",//overrides "1" true => "d",//overrides 1.5 ); var_dump($array); 

Вы можете использовать

 $vars = get_object_vars($object); echo $vars[1]; 

Строковые ключи, содержащие допустимые целочисленные значения, будут автоматически сбрасываться в целые ключи в создании «нормального» массива, но кажется, что отбрасывание из объекта в массив не применяется к той же логике.

Однако его можно исправить, используя

 $array = array_combine(array_keys($array), array_values($array)); 

после вашей строки, которая создает массив из объекта. http://codepad.viper-7.com/v5rGJa


Хотя, как сказал Дэйв в своем комментарии, использование get_object_vars выглядит как «более чистое» решение для меня.

 foreach ($array as $key => $value){ var_dump($key); var_dump($value); } 

шоу

 string(1) "1" string(3) "one" 

Но echo $array['"1"']; дает

 E_NOTICE : type 8 -- Undefined index: "1" -- at line 8 

Это странно!