복붙노트

객체를 배열로 변환하려면 어떻게해야합니까?

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

이것이 가능한가?

해결법

  1. ==============================

    1.당신은 get_object_vars를보아야한다. 당신의 프로퍼티가 private로 선언 되었기 때문에 이것을 클래스 내부에서 호출하고 그 결과를 리턴해야한다.

    당신은 get_object_vars를보아야한다. 당신의 프로퍼티가 private로 선언 되었기 때문에 이것을 클래스 내부에서 호출하고 그 결과를 리턴해야한다.

    조심해라. 문자열과 같은 원시 데이터 타입은 훌륭하게 작동하지만 중첩 된 객체가 어떻게 동작하는지 조심해야한다.

    당신의 경우에 당신은 뭔가를해야만합니다.

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

    2.단일 차원 배열을 변환하려면 (array)를 사용하여 캐스트하거나 get_object_vars가 있어야합니다. 그의 대답.

    단일 차원 배열을 변환하려면 (array)를 사용하여 캐스트하거나 get_object_vars가 있어야합니다. 그의 대답.

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

    그들은 서로 약간 다르게 작동합니다. 예를 들어, get_object_vars는 전달중인 객체의 범위 (즉, 객체의 멤버 함수)에서 호출되지 않는 한 공개적으로 액세스 가능한 속성 만있는 배열을 반환합니다. (배열)은 배열에 모든 public, private 및 protected 멤버가 그대로 배열로 캐스팅됩니다. 물론 모든 public은 물론입니다.

    다소 더러운 방법은 PHP> = 5.2의 기본 JSON 함수를 사용하여 JSON으로 인코딩 한 다음 다시 배열로 디코딩하는 것입니다. 그러나 여기에는 사적이고 보호 된 회원은 포함되지 않습니다.

    // The second parameter of json_decode forces parsing into an associative array
    $array = json_decode(json_encode($object), true);
    

    또는 다음 함수는 여기에서 가져온 것으로 캐스팅을 사용하도록 수정 된 private 및 protected 멤버를 포함하여 객체에서 배열로 변환합니다.

    function objectToArray ($object) {
        if(!is_object($object) && !is_array($object))
            return $object;
    
        return array_map('objectToArray', (array) $object);
    }
    
  3. ==============================

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

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

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

    4.꼼꼼한:

    꼼꼼한:

    $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;
    }
    
  5. ==============================

    5.

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

    객체를 가지고 foreach를 수행하는 몇 가지 방법을 시도했는데, 이것이 내가 본 가장 쉽고 멋진 해결 방법이다. 한 줄만 :)

  6. ==============================

    6.단순 버전 :

    단순 버전 :

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

    7.이 시도:-

    이 시도:-

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

    8.나는 같은 문제가 있었고 위에서 언급 한 get_object_vars를 사용하여이 문제를 해결했습니다.

    나는 같은 문제가 있었고 위에서 언급 한 get_object_vars를 사용하여이 문제를 해결했습니다.

    게다가, json_decode로 객체를 변환해야하고 oldschool for "루프"(반복적으로 사용하지 않고)를 사용하여 배열을 반복해야했습니다.

  9. ==============================

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

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

  10. ==============================

    10.앤티 언쇼 (Andy Earnshaw)의 답변에 문제가 발생했습니다. 응용 프로그램 내에서 별도의 클래스 인 "HelperFunctions"에이 함수를 포함 시켰기 때문에 objectToArray ()에 대한 재귀 호출이 실패했습니다.

    앤티 언쇼 (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);
    }
    

    나는이 글을 주석에 적었을 텐데 아직 충분한 평판이 없다.

  11. ==============================

    11.

    //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);
                }
            }
        }
    
  12. from https://stackoverflow.com/questions/2476876/how-do-i-convert-an-object-to-an-array by cc-by-sa and MIT license