Конвертировать PHP объект в ассоциативный массив - PullRequest
678 голосов
/ 03 декабря 2010

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

Я хотел бы использовать быструю и грязную функцию для преобразования объекта в массив.

Ответы [ 29 ]

1261 голосов
/ 03 декабря 2010

Просто введите его

$array =  (array) $yourObject;

С http://www.php.net/manual/en/language.types.array.php

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

Пример: простой объект

$object = new StdClass;
$object->foo = 1;
$object->bar = 2;

var_dump( (array) $object );

Выход:

array(2) {
  'foo' => int(1)
  'bar' => int(2)
} 

Пример: сложный объект

class Foo
{
    private $foo;
    protected $bar;
    public $baz;

    public function __construct()
    {
        $this->foo = 1;
        $this->bar = 2;
        $this->baz = new StdClass;
    }
}

var_dump( (array) new Foo );

Вывод (с \ 0s отредактирован для ясности):

array(3) {
  '\0Foo\0foo' => int(1)
  '\0*\0bar' => int(2)
  'baz' => class stdClass#2 (0) {}
}

Вывод с var_export вместо var_dump:

array (
  '' . "\0" . 'Foo' . "\0" . 'foo' => 1,
  '' . "\0" . '*' . "\0" . 'bar' => 2,
  'baz' => 
  stdClass::__set_state(array(
  )),
)

При такой установке типов глубокое приведение графа объекта не выполняется, и вам необходимо применить нулевые байты (как объяснено в ручной цитате) для доступа к любым непубличным атрибутам. Так что это лучше всего работает при приведении объектов StdClass или объектов только с открытыми свойствами. Для быстрой и грязной (то, что вы просили) это хорошо.

Также смотрите этот подробный пост в блоге:

296 голосов
/ 19 апреля 2013

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

$array = json_decode(json_encode($nested_object), true);
62 голосов
/ 03 декабря 2010

От первого попадания Google для « php объекта до связанного массива » мы имеем следующее:

function object_to_array($data)
{
    if (is_array($data) || is_object($data))
    {
        $result = array();
        foreach ($data as $key => $value)
        {
            $result[$key] = object_to_array($value);
        }
        return $result;
    }
    return $data;
}

Источник на codesnippets.joyent.com .

53 голосов
/ 15 апреля 2013

Если ваши свойства объекта являются общедоступными, вы можете сделать:

$array =  (array) $object;

Если они закрытые или защищены, у них будут странные имена ключей в массиве.Итак, в этом случае вам понадобится следующая функция:

function dismount($object) {
    $reflectionClass = new ReflectionClass(get_class($object));
    $array = array();
    foreach ($reflectionClass->getProperties() as $property) {
        $property->setAccessible(true);
        $array[$property->getName()] = $property->getValue($object);
        $property->setAccessible(false);
    }
    return $array;
}
13 голосов
/ 09 января 2014
class Test{
    const A = 1;
    public $b = 'two';
    private $c = test::A;

    public function __toArray(){
        return call_user_func('get_object_vars', $this);
    }
}

$my_test = new Test();
var_dump((array)$my_test);
var_dump($my_test->__toArray());

Выход

array(2) {
    ["b"]=>
    string(3) "two"
    ["Testc"]=>
    int(1)
}
array(1) {
    ["b"]=>
    string(3) "two"
}
11 голосов
/ 05 февраля 2013

Все остальные ответы, размещенные здесь, работают только с открытыми атрибутами. Вот одно решение, которое работает с javabean -подобными объектами, используя отражение и геттеры:

function entity2array($entity, $recursionDepth = 2) {
    $result = array();
    $class = new ReflectionClass(get_class($entity));
    foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
        $methodName = $method->name;
        if (strpos($methodName, "get") === 0 && strlen($methodName) > 3) {
            $propertyName = lcfirst(substr($methodName, 3));
            $value = $method->invoke($entity);

            if (is_object($value)) {
                if ($recursionDepth > 0) {
                    $result[$propertyName] = $this->entity2array($value, $recursionDepth - 1);
                } else {
                    $result[$propertyName] = "***";     //stop recursion
                }
            } else {
                $result[$propertyName] = $value;
            }
        }
    }
    return $result;
}
9 голосов
/ 11 декабря 2013

А как насчет get_object_vars($obj)? Кажется полезным, если вы хотите получить доступ только к открытым свойствам объекта. http://www.php.net/function.get-object-vars

9 голосов
/ 20 сентября 2011

Вот код:

function object_to_array($data) {
    if ((! is_array($data)) and (! is_object($data))) return 'xxx'; //$data;
    $result = array();

    $data = (array) $data;
    foreach ($data as $key => $value) {
        if (is_object($value)) $value = (array) $value;
        if (is_array($value)) 
        $result[$key] = object_to_array($value);
        else
            $result[$key] = $value;
    }

    return $result;
}
6 голосов
/ 03 июня 2016

Вы можете легко использовать эту функцию для получения результата.

function objetToArray($adminBar){
      $reflector = new ReflectionObject($adminBar);
      $nodes = $reflector->getProperties();
      $out=[];
      foreach ($nodes as  $node) {
          $nod=$reflector->getProperty($node->getName());
          $nod->setAccessible(true);
          $out[$node->getName()]=$nod->getValue($adminBar);
      }
      return $out;
  }

use> = php5

6 голосов
/ 03 декабря 2010

Введите приведение вашего объекта к массиву.

$arr =  (array) $Obj;

Это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...