Convert a PHP object to an associative array

后端 未结 30 1576
走了就别回头了
走了就别回头了 2020-11-22 02:18

I\'m integrating an API to my website which works with data stored in objects while my code is written using arrays.

I\'d like a quick-and-dirty function to convert

相关标签:
30条回答
  • 2020-11-22 02:52

    Just typecast it

    $array = (array) $yourObject;
    

    From Arrays:

    If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side.

    Example: Simple Object

    $object = new StdClass;
    $object->foo = 1;
    $object->bar = 2;
    
    var_dump( (array) $object );
    

    Output:

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

    Example: Complex Object

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

    Output (with \0s edited in for clarity):

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

    Output with var_export instead of var_dump:

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

    Typecasting this way will not do deep casting of the object graph and you need to apply the null bytes (as explained in the manual quote) to access any non-public attributes. So this works best when casting StdClass objects or objects with only public properties. For quick and dirty (what you asked for) it's fine.

    Also see this in-depth blog post:

    • Fast PHP Object to Array conversion
    0 讨论(0)
  • 2020-11-22 02:52

    Here is some code:

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 02:53

    All other answers posted here are only working with public attributes. Here is one solution that works with JavaBeans-like objects using reflection and getters:

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 02:53

    Also you can use The Symfony Serializer Component

    use Symfony\Component\Serializer\Encoder\JsonEncoder;
    use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
    use Symfony\Component\Serializer\Serializer;
    
    $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
    $array = json_decode($serializer->serialize($object, 'json'), true);
    
    0 讨论(0)
  • 2020-11-22 02:55

    To convert an object into array just cast it explicitly:

    $name_of_array = (array) $name_of_object;
    
    0 讨论(0)
  • 2020-11-22 02:56
    $Menu = new Admin_Model_DbTable_Menu(); 
    $row = $Menu->fetchRow($Menu->select()->where('id = ?', $id));
    $Addmenu = new Admin_Form_Addmenu(); 
    $Addmenu->populate($row->toArray());
    
    0 讨论(0)
提交回复
热议问题