У меня был этот вопрос раньше, и было сделано заключение, что это была ошибка в 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));