[php] PHP 객체를 연관 배열로 변환

코드를 배열을 사용하여 작성하는 동안 객체에 저장된 데이터로 작동하는 API를 웹 사이트에 통합하고 있습니다.

객체를 배열로 변환하는 빠르고 더러운 기능을 원합니다.



답변

그냥 캐스트

$array = (array) $yourObject;

에서 배열 :

객체가 배열로 변환되면 결과는 요소가 객체의 속성 인 배열입니다. 키는 몇 가지 예외를 제외하고 멤버 변수 이름입니다. 정수 특성에 액세스 할 수 없습니다. 개인 변수는 클래스 이름 앞에 변수 이름이 붙습니다. 보호 된 변수는 변수 이름 앞에 ‘*’가 붙습니다. 이 앞에 붙은 값은 양쪽에 널 바이트가 있습니다.

예 : 단순 객체

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

출력 (명확성을 위해 편집 된 \ 0) :

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 객체 또는 공용 속성 만있는 객체를 캐스팅 할 때 가장 효과적입니다. 빠르고 더러운 (요청 한 것) 괜찮습니다.

이 심층 블로그 게시물도 참조하십시오.


답변

JSON 인코딩 / 디코딩 함수의 동작에 의존하여 깊이 중첩 된 객체를 연관 배열로 빠르게 변환 할 수 있습니다.

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


답변

PHP 오브젝트에 대한 첫 번째 Google 히트 에서 assoc 배열 “에 이르기까지

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에 있습니다.


답변

객체 속성이 공개 인 경우 다음을 수행 할 수 있습니다.

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


답변

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"
}


답변

다음은 몇 가지 코드입니다.

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


답변

여기에 게시 된 다른 모든 답변은 공용 속성으로 만 작동합니다. 리플렉션과 게터를 사용하여 JavaBeans 와 같은 객체 와 함께 작동하는 솔루션은 다음과 같습니다 .

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