Web

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

У меня есть следующий код:

<?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

    )...

)

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

 

Ответ 1

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

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

//  преобразование к массиву

$array = (array) $object;

// get_object_vars

$array = get_object_vars($object);

 

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

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

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

// Второй параметр json_decode заставляет выполнять разбор в ассоциативный массив

$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);

}

 

Ответ 2

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

<?php

   print_r(get_object_vars($response->response->docs));

?>

 

Ответ 3

Пример:

$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;

}

 

Ответ 4

Простой пример:

$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();

 

 

Ответ 5

Я столкнулся с проблемой, связанной с предыдущим ответом, потому что я выделил эту функцию в отдельный класс в своем приложении, "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);

}

 

Ответ 6

// Моя функция работает. Надеюсь, это поможет вам :)

      $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);

            }

        }

    }

 

Схожие статьи

Web

Лучшие практики для настраиваемых помощников в Laravel 5

Web

Почему происходит «Неопределенная переменная/индекс/смещение» в PHP

Web

Отношения Laravel: попытка получить "описание" свойства не-объекта

Web

Возврат JSON из PHP-скрипта

×