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

204
<?php
   print_r($response->response->docs);
?>

Выводит следующее:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

Как я могу преобразовать этот объект в массив? Я хотел бы вывести следующее:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

Это возможно?

Захир Хуссейн
источник

Ответы:

133

Вы должны посмотреть на get_object_vars , так как ваши свойства объявлены как private, вы должны вызвать это внутри класса и вернуть его результаты.

Будьте осторожны, для примитивных типов данных, таких как строки, он будет отлично работать, но я не знаю, как он ведет себя с вложенными объектами.

в вашем случае вы должны сделать что-то вроде;

<?php
   print_r(get_object_vars($response->response->docs));
?>
Benoit
источник
385

Одномерные массивы

Для преобразования одноразмерных массивов вы можете привести с использованием (array)или есть get_object_vars, что Бенуа упомянул в своем ответе .

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Они работают немного по-другому. Например, get_object_varsвернет массив только с общедоступными свойствами, если он не вызывается из области действия передаваемого объекта (т. Е. В функции-члене объекта). (array)с другой стороны, будет приведен к массиву со всеми открытыми, частными и защищенными членами в массиве, хотя теперь все общедоступные, конечно.

Многомерные массивы

Несколько грязный метод заключается в использовании собственных функций JSON PHP> = 5.2 для кодирования в JSON, а затем декодирования обратно в массив. Однако это не будет включать закрытые и защищенные члены и не подходит для объектов, содержащих данные, которые не могут быть закодированы в JSON (например, двоичные данные).

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

В качестве альтернативы следующая функция преобразует объект в массив, включающий закрытые и защищенные члены, взятые отсюда и модифицированные для использования приведения:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}
Энди Э
источник
5
Первое решение не обрабатывало многоразмерность, но второе решение работало отлично.
выпил
1
Второе решение напомнило мне, что есть второй параметр json_decode (), который я забыл .. спасибо.
Тайлер
1
Интересно, почему этот ответ набирает столько голосов. Оба решения менее понятны и красивы, чем get_object_vars
RJD22
3
@ RJD22: я обновил свой ответ, чтобы сделать его более «фактическим» ресурсом, надеюсь, вы считаете его достойным его голосов. ;-) Обратите внимание, что «второе решение», на которое ссылаются комментарии, - это решение JSON, которое было вторым в моем первом ответе.
Энди Е
ЗДОРОВО! Я был поражен решением и прокрутил вниз, чтобы найти это!
Эоззи
44

Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, полагаясь на поведение функций кодирования / декодирования JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
источник
2
Это самый простой ответ на эту проблему. Использовал его, и он работал потрясающе. Спасибо
Дастин Фрейкер
7
Просто примечание - это будет работать, если ваш массив содержит действительные данные UTF8. Если ваш массив содержит какую-то другую кодировку, скажем, Win1250, он потерпит неудачу, так как json_encode потерпит неудачу (php 5.3)
Radek
Как преобразовать его обратно в объект?
Pmpr
@Trix использовать JSON снова json_decode (json_encode ($ массив), FALSE); Это также (рекурсивно) преобразует все ваши подразделам массивов в объекты,
Mufaddal
Я хотел бы поднять это не раз.
JohnFF
34

Осторожный:

$array = (array) $object;

выполняет поверхностное преобразование ($ object-> innerObject = new stdClass () остается объектом) и выполняет преобразование назад и вперед с использованием json, но это не очень хорошая идея, если производительность является проблемой.

Если вам нужно, чтобы все объекты были преобразованы в ассоциативные массивы, то это лучший способ сделать это (код, скопированный из я не помню, где):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}
Sergio
источник
Я не могу прочитать массив, полученный в результате приведения объекта: codepad.viper-7.com/AkX5pq У вас есть какие-либо объяснения по этому поводу?
Дэмиен
1
Мне больше нравится этот ответ. Рекурсивная функция Энди Э, по сути, делает то же самое, но мне легче ее понять.
HartleySan
20
$array = json_decode(json_encode($object), true);

Я попробовал несколько способов сделать это foreachс объектом, и это действительно самый простой и крутой обходной путь, который я когда-либо видел. Всего одна строчка :)

m3nda
источник
Отлично работает только с атрибутами публичных объектов. Не считает частные.
Лимон
Вот некоторые пояснения по поводу использования функции JsonSerialize, но это не однострочное решение, о котором я читал, это не очень хорошая практика :( stackoverflow.com/questions/7005860/… . Спасибо за совет.
m3nda
Как преобразовать его обратно в объект?
Pmpr
18

Простая версия:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Обновленная рекурсивная версия:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();
Стикс
источник
2

Попробуй это:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>
Кунал
источник
2

У меня была та же проблема, и я решил ее с помощью get_object_vars, упомянутых выше.

Кроме того, мне пришлось преобразовать мой объект с помощью json_decode, и мне пришлось перебирать массив с циклом oldschool «for» (а не для for-each).

Лукас Баччиотти
источник
0

Вы также можете использовать метод array_values ​​() в php

Рикин Адхьяпак
источник
2
Ты не можешь «Array_values ​​() ожидает, что параметр 1 будет массивом, заданным объектом».
manatwork
0

Я столкнулся с проблемой с ответом Энди Эрншоу, потому что я выделил эту функцию в отдельный класс в моем приложении, «HelperFunctions», что означало, что рекурсивный вызов objectToArray () не удался.

Я преодолел это, указав имя класса в вызове array_map следующим образом:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Я бы написал это в комментариях, но у меня пока недостаточно репутации.

leon.clements
источник
-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }
nguyentrung206
источник
ваша функция ничего не возвращает. это никак не работает!
Rotimi