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

StackOverflow https://stackoverflow.com/questions/316747

  •  11-07-2019
  •  | 
  •  

Вопрос

У меня был этот вопрос ранее, и было решено, что это ошибка в 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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top