Как преобразовать объект обратно в массив?

После этого ">вопрос, я использую эту функцию для преобразования массивов в объекты,

function array_to_object($array)
{
    if(!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    foreach($array as $key => $value)
    {
        $key = (string) $key ;
        $object->$key = is_array($value) ? array_to_object($value) : $value;
    }
    return $object;
}

So,

$obj =  array('qualitypoint', 'technologies', 'India');

результат,

stdClass Object
(
    [0] => qualitypoint
    [1] => technologies
    [2] => India
)

Но теперь мне нужно преобразовать объект обратно в массив, чтобы я мог получить этот результат,

Array
(
    [0] => qualitypoint
    [1] => technologies
    [2] => India
)

Является ли это возможным?


person laukok    schedule 05.04.2012    source источник
comment
Тогда зачем вообще превращать его в объект? Вы все еще можете получить свои значения из своего $obj?   -  person Bono    schedule 05.04.2012


Ответы (2)


Другой способ добиться этого:

$array = array(json_decode(json_encode($object), true));

Когда я тестировал, у меня не было проблем с недоступными свойствами.

Обновление: он также работает с

$object = new stdClass();
$object->{0} = 'qualitypoint';
$object->{1} = 'technologies';
$object->{2} = 'India';
person Frank van Wijk    schedule 05.04.2012
comment
Он снова хочет массив, а не объект - person Baba; 05.04.2012
comment
Да, я имел в виду, что stdClass в приведенном выше коде — это объект, который у вас есть на входе. @Iauthiamkok, примете ли вы мой ответ, если используете это решение? - person Frank van Wijk; 05.04.2012
comment
@lauthiamkok: Имейте в виду, что строковые свойства должны быть закодированы в UTF-8, иначе этот метод не будет работать. - person Jon; 05.04.2012
comment
Спасибо Джон за совет. Можете ли вы привести пример, когда этот код не будет работать? Как я могу убедиться, что they must be encoded in UTF-8? Спасибо. - person laukok; 05.04.2012
comment
@lauthiamkok: json_encode: Эта функция работает только с UTF. -8 закодированных данных (иначе возвращается null и метод не работает). Если это еще не UTF-8, вам нужно изменить кодировку, например. с iconv. - person Jon; 06.04.2012

Что было бы хорошо, но не будет работать так, как есть

Обычно хорошим начальным подходом является простое приведение объект в массив:

$arr = (array) $obj;

Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта. Ключами являются имена переменных-членов, за некоторыми исключениями: целочисленные свойства недоступны; частные переменные имеют имя класса, предшествующее имени переменной; защищенные переменные имеют '*' перед именем переменной. Эти предшествующие значения имеют нулевые байты с обеих сторон.

К сожалению, это не сработает для вас, потому что свойства имеют «целочисленные» имена.


Разновидностью вышеизложенного является get_object_vars:

$arr = get_object_vars($obj);

Одним из важных моментов здесь является то, что get_object_vars уважает видимость, а это означает, что он только предоставит вам общедоступные свойства $obj, поскольку вы не вызываете его из метода $obj.

Однако в данном случае это также не сработает: get_object_vars также не даст вам свойств с целочисленными именами.

Что будет работать (но не приятно)

Перебор объекта также даст вам видимый свойств, которые у него есть (в данном случае только public свойств), но он также будет обрабатывать свойства с целочисленными именами:

$arr = array();
foreach($obj as $k => $v) {
    $arr[$k] = $v;
}
person Jon    schedule 05.04.2012