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


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

이게 가능해?

답변:


133

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

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

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

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

385

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

5
첫 번째 솔루션은 다중 치수를 처리하지 않았지만 두 번째 솔루션은 훌륭하게 작동했습니다.
sbuck

1
두 번째 솔루션은 json_decode ()에 두 번째 매개 변수가 있다는 것을 상기시켜주었습니다.
Tyler

1
이 답변이 왜 그렇게 많은 표를 얻고 있는지 궁금합니다. 두 솔루션 모두 get_object_vars보다 덜 명확하고 예쁘다
RJD22

3
@ RJD22 : 나는 사실을 더 많은 자원으로 만들기 위해 내 대답을 업데이트했습니다. ;-) 의견이 여기에 언급 된 "2 차 솔루션"은 JSON 솔루션으로, 첫 번째 답변에서 2 차라는 것을 주목하십시오.
Andy E

대박! 나는 해결책에 놀랐고 이것을 찾기 위해 아래로 스크롤했습니다!
eozzy

44

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

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

2
이것이이 문제에 대한 가장 간단한 대답입니다. 그것을 사용하고 훌륭하게 작동했습니다. 감사합니다
Dustin Fraker

7
참고 사항-배열에 UTF8 유효한 데이터가 포함 된 경우 작동합니다. 배열에 다른 인코딩이 포함되어 있으면 Win1250이라고 말하면 json_encode가 실패하므로 실패합니다 (php 5.3)
Radek

다시 객체로 변환하는 방법?
Pmpr 2019 년

@Trix는 json을 다시 사용합니다. json_decode (json_encode ($ array), FALSE); 이것은 (재귀 적으로) 모든 하위 배열을 객체로 변환합니다.
Mufaddal

나는 이것을 한 번 이상 꾸짖을 수 있기를 바랍니다.
JohnFF

34

꼼꼼한:

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

객체 캐스팅의 결과로 배열을 읽을 수 없습니다 : codepad.viper-7.com/AkX5pq 그것에 대해 설명이 있습니까?
Damien

1
이 답변이 가장 좋습니다. Andy E의 재귀 함수는 본질적으로 동일한 기능을 수행하지만 이해하기 더 쉽습니다.
HartleySan

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

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


공용 객체 속성에서만 완벽하게 작동합니다. 사적인 것을 고려하지 않습니다.
Limon 2016 년

여기에 사용 JsonSerialize 기능에 대한 몇 가지 설명이 있지만, 한 줄의 솔루션이 아닙니다 그리고 난에 대한 좋은 연습 :( 아닌 읽을 stackoverflow.com/questions/7005860/... 조언 주셔서 감사합니다..
m3nda

다시 객체로 변환하는 방법?
Pmpr 2019 년

18

간단한 버전 :

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

2

이 시도:-

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

2

나는 같은 문제가 있었고 위에서 언급 한 get_object_vars로 해결했습니다 .

또한 객체를 json_decode 로 변환 하고 oldschool "for"루프를 사용하여 배열을 반복해야했습니다 (각각 for for 루프).


0

PHP의 array_values ​​() 메소드를 사용할 수도 있습니다


2
당신은 할 수 없습니다. “array_values ​​()는 매개 변수 1이 객체가 될 배열을 기대합니다”.
manatwork

0

Andy Earnshaw의 답변에 문제가 발생했습니다.이 함수를 내 응용 프로그램 "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);
}

나는 의견에 이것을 썼을 것입니다. 그러나 나는 아직 평판이 충분하지 않습니다.


-2
//My Function is worked. Hope help full for you :)
      $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);
            }
        }
    }

함수가 아무것도 반환하지 않습니다. 작동하는 방법이 없습니다!
Rotimi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.