Ошибка PHP с преобразованием объекта в массивы

У меня был этот вопрос раньше, и было сделано заключение, что это была ошибка в 5.2.5. Ну, он все еще разбит в 5.2.6, по крайней мере для меня:

Пожалуйста, дайте мне знать, если он сломан или работает для вас:

$obj = new stdClass(); $obj->{"foo"} = "bar"; $obj->{"0"} = "zero"; $arr = (array)$obj; //foo -- bar //0 -- {error: undefined index} foreach ($arr as $key=>$value){ echo "$key -- " . $arr[$key] . "\n"; } 

Любые способы «исправить» массив после того, как он был перенесен из stdClass?

Определенно кажется ошибкой для меня (PHP 5.2.6).

Вы можете исправить массив следующим образом:

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

Об этом сообщается в этом отчете об ошибке, но отмечен как фиктивный … в документации говорится:

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

Немногие эксперименты показывают, что собственные функции phps не сохраняют эту фьюбативность.

 function noopa( $a ){ return $a; } $arr = array_map('noopa', $arr ); $arr[0]; # no error! 

Это фактически создает копию массива, и исправление происходит во время копирования.

В конечном счете, его сбой дизайна по всем направлениям, попробуйте использовать array_merge так, как вы думаете, что он работает с массивом со смешанными числовыми и строковыми ключами?

Все нумерованные элементы копируются, а некоторые получают повторное пронумерование, даже если некоторые просто являются строковыми инкапсулированными числами, и, как результат, для решения этой проблемы существуют десятки реализаций homebrew array_merge.

Назад, когда php попытался сделать клон perl и потерпел неудачу, они не понимали концепцию массивов и хешей, являющихся различными понятиями, а вместо этого объединили их в один универсальный зонтик. Хорошо идет!.

Для их следующего трюка им удается разбить разделители пространства имен из-за какой-то технической проблемы, с которой по какой-то причине не встречался какой-либо другой язык.

Спасибо RoBorg .. Я просто это обнаружил 🙂

Вот еще одно решение, не уверен, что это быстрее или нет:

 unserialize(serialize($arr));