[php] 객체를 배열로 어떻게 변환합니까?

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

이게 가능해?



답변

get_object_vars를 살펴 보십시오. 속성이 비공개로 선언 되었으므로 클래스 내에서 이것을 호출하고 결과를 반환해야합니다.

문자열과 같은 기본 데이터 유형의 경우 훌륭하게 작동하지만 중첩 된 객체에서 어떻게 작동하는지 모르겠습니다.

귀하의 경우에는 다음과 같은 일을해야합니다.

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


답변

1 차원 배열

단일 차원 배열을 변환의 경우, 사용 캐스트 할 수 있습니다 (array)또는 거기에 get_object_vars벤와가 언급하는
그의 대답 .

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

그들은 서로 약간 다르게 작동합니다. 예를 들어, get_object_vars전달하는 객체의 범위 내에서 (즉, 객체의 멤버 함수에서) 호출되지 않는 한 공개적으로 액세스 가능한 속성 만있는 배열을 반환합니다. (array)반면에, 모든 공개, 비공개 및 보호 된 멤버가 현재 공개 상태이지만 모든 공개, 비공개 및 보호 된 멤버가 그대로 어레이에 캐스트됩니다.

다차원 배열

다소 더러운 방법은 PHP> = 5.2의 기본 JSON 함수를 사용하여 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);
}


답변

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

$array = json_decode(json_encode($response->response->docs), true);


답변

꼼꼼한:

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


답변

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

나는 foreach객체로 여러 가지 방법을 시도했지만 실제로 이것은 내가 본 가장 쉽고 멋진 해결 방법입니다. 한 줄만 🙂


답변

간단한 버전 :

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


답변

이 시도:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>