PHP ошибка с преобразованием объекта в массив - PullRequest
3 голосов
/ 25 ноября 2008

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

Ответы [ 3 ]

2 голосов
/ 25 ноября 2008

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

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

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

Это было сообщено в этом отчете об ошибке , но помечено как поддельное ... документация говорит:

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

1 голос
/ 25 ноября 2008

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

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

По сути, это просто создает копию массива, и исправление происходит во время копирования.

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

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

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

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

0 голосов
/ 25 ноября 2008

Спасибо, Роборг .. Я тоже это обнаружил :)

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

unserialize(serialize($arr));
...