itsource

개체를 어레이로 변환하려면 어떻게 해야 합니까?

mycopycode 2022. 9. 18. 10:17
반응형

개체를 어레이로 변환하려면 어떻게 해야 합니까?

<?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차원 배열을 사용하여 할 수 .(array)아니면 브누아 씨가 답변에서 언급했던 것이 있습니다.

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

get_object_vars에서 속성을 private로 선언할 때 클래스 내에서 호출하여 결과를 반환해야 합니다.

문자열과 같은 원시 데이터 유형은 매우 유용하지만 중첩된 개체에서는 어떻게 작동하는지 알 수 없습니다.

당신의 경우, 당신은 다음과 같은 것을 해야 합니다.

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

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

저도 같은 문제가 있어서 위의 get_object_vars로 해결했습니다.

게다가 오브젝트를 json_decode로 변환하고, 구식의 「for」루프(각각의 「for」루프를 사용해 어레이를 반복할 필요가 있었습니다.

이 함수를 어플리케이션 내의 다른 클래스인 "HelperFunctions"에 포함시켜 objectToArray()에 대한 재귀 호출이 실패했기 때문에 Andy Earnshow의 답변에 문제가 발생했습니다.

array_map 호출 내에서 클래스 이름을 다음과 같이 지정함으로써 이 문제를 해결했습니다.

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

댓글로 썼을 텐데 아직 평판이 안 좋아요.

php의 array_values() 메서드를 사용할 수도 있습니다.

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

언급URL : https://stackoverflow.com/questions/2476876/how-do-i-convert-an-object-to-an-array

반응형