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 так, как вы думаете, он работает с массивом со смешанными числовыми и строковыми ключами? Р>
Все пронумерованные элементы копируются, а некоторые - нумеруются, даже если некоторые из них просто являются числами с инкапсулированными строками, и в результате существуют десятки реализаций array_merge, написанных на доморощенном языке, просто для решения этой проблемы. Р>
Когда php попытался создать клон perl и потерпел неудачу, они не поняли концепцию массивов и хешей как отдельных концепций, а вместо этого объединили их в один универсальный зонтик. Хорошо идет!. Р>
Для их следующего трюка им удается сломать разделители пространства имен из-за какой-то технической проблемы, с которой по какой-либо причине не сталкивался ни один другой язык. Р>
Спасибо, Роборг. Я тоже это обнаружил:)
Вот еще одно решение, не уверенное, быстрее оно или нет:
unserialize(serialize($arr));