PHP stdClass에서 배열로


195

stdClass 객체를 배열로 변환하는 데 문제가 있습니다. 나는 이런 식으로 시도했다 :

return (array) $booking;

또는

return (array) json_decode($booking,true);

또는

return (array) json_decode($booking);

캐스트하기 전에 배열에 하나의 레코드가 가득 찼습니다. 캐스트하려고하면 비어 있습니다. 행을 삭제하지 않고 캐스트 / 변환하는 방법은 무엇입니까?

캐스트하기 전에 배열 :

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

캐스트가 비어 있으면 NULL을 만들려고하면 var_dump($booking);

나는 또한이 기능을 시도했지만 항상 비어 있습니다.

public function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }

php.net/var_dump ... php.net/var_export- 이전 return. 그리고 json_decode배열에서 실행 하는 것은 나에게 필사적 인 것 같습니다. 아마도 컴퓨터 앞에 너무 오래 앉아 있으면 휴식을 취할 시간입니까?
hakre

명확히하기 위해 : var_dump($booking);출력 NULL?
hakre

캐스트 후, 그리고 내가 이것을 인쇄하려고하면 : $ booking [0] [ 'id'] 존재하지 않는 날 반환
Alessandro Minoccheri

당신은 읽기에 관심이있을 수 있습니다 어떻게 PHP에서 유용한 오류 메시지를 얻는 방법? 어쨌든, 나는 캐스팅 하기 var_dump() 전에 묻고있었습니다 . 동일한 변수 이름 btw를 재사용하지 마십시오. 경우 $booking캐스팅 전에 무언가가 있었다, 여전히 뭔가해야 전에 나중에 캐스팅이 아닌 뭔가 다른합니다. 입력 변수와 처리 변수가 다르면 더 이상 이해하지 못하는 문제가 발생합니다.
hakre

사용자 정의 함수 코드를 제거하는 것과 같이 질문을 단축하면 아래로 스크롤하지 않고도 허용 된 답변을 볼 수 있습니다.
cnlevy

답변:


433

지연 한 라이너 방법

약간의 성능을 잃고 싶다면 JSON 메소드를 사용하여 하나의 라이너 에서이 작업을 수행 할 수 있습니다 (일부는 PHP가 함수 호출 속도느리기 때문에 객체를 반복적으로 반복하는 것보다 빠릅니다 ). " 하지만 난 이미 이걸 했어 " 정확하게는 아닙니다- json_decode배열에서 사용했지만 json_encode먼저 인코딩해야합니다 .

요구 사항

json_encodejson_decode방법. 이들은 PHP 5.2.0 이상에서 자동으로 번들로 제공됩니다. 이전 버전을 사용하는 경우 PECL 라이브러리있습니다 (이 경우 PHP 설치를 실제로 업데이트해야합니다. 2006 년 5.1 지원 중단).


array/ stdClass-> 변환stdClass

$stdClass = json_decode(json_encode($booking));

array/ stdClass-> 변환array

매뉴얼은 두 번째 인수를 다음과 json_decode같이 지정합니다 .

assoc
When TRUE이면 반환 된 객체가 연관 배열로 변환됩니다.

따라서 다음 줄은 전체 객체를 배열로 변환합니다.

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

1
경우 (array) $booking;A의 것이 var_dump된다 NULL(OP에 의해 작성된)이 코드가 반환됩니다 어떻게 됐을까?
hakre

@hakre 그것은 NULL배열로 캐스팅 한 후 처럼 보이지 않습니다 . OP는 NULL사용 후 매뉴얼에json_decode($array) 따라 의미가 있다고 생각 합니다 . json을 디코딩 할 수없는 경우 NULL이 반환됩니다.
h2ooooooo

4
@AlessandroMinoccheri 이전에 작동하지 않은 이유 json_decode()는 어레이 에서 사용하기 전이었습니다 . json_decodeJSON 문자열에서 사용해야합니다. 우리가 처음 JSON 문자열로 인코딩 (경우에 따라서 json_encode) 및 다음 (우리 JSON 문자열을 사용)을 디코딩하고 그것을 잘 작동합니다.
h2ooooooo

3
모두 JSON 사양에 정의되지 않은 유형 (예 : 날짜)을 잃어 버릴 것을 잊었습니까? 이 방법을 사용하려면 리바이 버가 필요합니다. 숫자, 문자열 및 부울과 같은 기본 유형이있는 경우에만 유용합니다.
Denis Pshenov

1
좋은 대답, 난 그냥 json_decode ($ stdClass, true);)를 사용했습니다
didando8a 10시 03 분

68

이 함수를 사용하여 다음 유형의 표준 배열을 다시 가져옵니다.

return get_object_vars($booking);

19
이것은 재귀 적이 지 않습니다
gawpertron

17

캐스트하기 전에 배열이므로 캐스트하는 것은 의미가 없습니다.

다음과 같은 재귀 캐스트가 필요할 수 있습니다.

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

용법:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

결과 :

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

결과 :

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

노트 :

stdClass 객체가 다른 stdClass 객체를 포함 할 수있는 복잡한 배열을 테스트하고 작업했습니다.


큰. 이제 :) stdClass 객체를 포함 stdClass 개체에 대해 작동합니다
블라드 프레 다

14

PHP stdClass를 배열로 변환하려면 다음 PHP 함수를 사용하십시오

get_object_vars($data)

2
이 함수는 재귀 적이 지 않습니다. 재귀 솔루션 은 Carlo Fontanos 의 답변을 참조하십시오 .
Courtney Miles


12

내장 유형 캐스트 ​​기능을 사용하십시오. 간단히 입력하십시오.

$realArray = (array)$stdClass;

1
나는 이것을 json_decode / encode보다 선호한다. +1
Logan

2
이 메소드는 더 깨끗하지만 재귀 적이 지 않으며 get_object_vars ()와 동일하게 작동합니다. json_decode / encode 메소드에는 해킹 느낌이 있지만 재귀 적으로 작동합니다.
Debbie V

3

그냥 그것을 인터넷 검색, 발견 여기에 반복적으로 배열에 stdClass 객체를 변환하는 데 유용 편리한 기능.

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

편집 : 나는 제안 한 mason81 덕분에 링크 된 소스 (지금도 변경됨)의 내용 으로이 답변을 업데이트했습니다.


1
다음에는 링크 된 소스의 관련 컨텐츠를 포함하십시오. 제공하신 링크가 변경되어 이제는 관련이없고 쓸모가 없습니다.
mason81

이것이 내가 찾던 것입니다. 정말 감사합니다.

0

다음은 클래스에서 사용할 수있는 Carlo의 답변 버전입니다.

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}

0

다음 코드는 모든 이메일을 읽고 제목, 본문 및 날짜를 ​​인쇄합니다.

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

이것은 다음을 출력합니다 :

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

다양한 제안으로 어려움을 겪고 시행 착오를 사용 하여이 솔루션을 생각해 냈습니다. 도움이 되길 바랍니다.


0

다음은 내가 가지고있는 최상의 Object to Array 함수입니다. 재귀 적으로 작동합니다.

function object_to_array($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            object_to_array_v2($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}

$ clean_array = object_to_array ($ object_data_here);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.