PHP에서 stdClass 객체를 배열로 변환


108

postmeta에서 post_id를 다음과 같이 가져옵니다.

$post_id = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'mfn-post-link1' AND meta_value = '". $from ."')");

내가 시도 print_r($post_id); 하면 다음과 같은 배열이 있습니다.

Array
(
    [0] => stdClass Object
        (
            [post_id] => 140
        )

    [1] => stdClass Object
        (
            [post_id] => 141
        )

    [2] => stdClass Object
        (
            [post_id] => 142
        )

)

그리고 나는 그것을 횡단하는 방법을 모르고 어떻게 이렇게 배열을 얻을 수 있습니까?

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

어떻게 할 수 있는지 아십니까?


답변:


244

가장 쉬운 방법은 객체를 JSON으로 인코딩 한 다음 다시 배열로 디코딩하는 것입니다.

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

또는 원하는 경우 개체를 수동으로 탐색 할 수도 있습니다.

foreach ($object as $value) 
    $array[] = $value->post_id;

1
왜 우리는 할 수 $array = json_decode($object,true)없습니까?
akshaynagpal

3
@akshaynagpal : JSON 문자열을 입력으로 기대하는 함수에 객체를 제공하기 때문에 오류가 발생합니다. 대답에서 객체를 JSON 문자열로 변환 한 다음 json_decode ()에 대한 입력으로 공급하여 배열을 반환합니다 (두 번째 매개 변수가 True이면 배열이 반환되어야 함을 나타냄).
Amal Murali

6
너무 늦었다는 것을 알고 있지만 유형 캐스팅을 사용하지 않는 이유는 ... (배열) $ obj
chhameed

내가 발견 json_decode(json_encode($object), True)foreach는 루프에 비해 다른 배열을 돌려 보냈다. foreach 루프는 OP가 요청한 형식으로 배열을 반환합니다.
user3442612

1
@NgSekLong : 정말 아니에요.
Amal Murali

60

매우 간단합니다. 먼저 객체를 json 객체로 바꾸면 객체의 문자열이 JSON 대표로 반환됩니다.

해당 결과를 가져 와서 추가 매개 변수 인 true로 디코딩하면 연관 배열로 변환됩니다.

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

문제는 json으로 인코딩 할 수 없거나 표준화되지 않은 값에 있습니다. 날짜.
Kangur

20

이 시도:

$new_array = objectToArray($yourObject);

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

1
완전한 기능 배열로 stdobject을 변경
비벡

16

다음과 같이 std 객체를 배열로 변환 할 수 있습니다.

$objectToArray = (array)$object;

1
이것은 훌륭하지만 첫 번째 수준 만 변환합니다. 중첩이있는 경우 모든 노드에 대해 수행해야합니다.
Ivan Carosati

7

1 차원 배열의 경우 :

$array = (array)$class; 

다차원 배열의 경우 :

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

5
SO에 오신 것을 환영합니다. 문제를 해결하는 방법을 설명하기 위해 답변을 조금 확장 해 주시겠습니까?
gung-Monica 복원

1 차원 배열의 경우 : $ array = (array) $ class; 다차원 어레이의 경우 : 위의 코드
스택 오버플로

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A는 "output_type"인수입니다. 4 개의 미리 정의 된 상수 중 하나 일 수 있습니다 (기본값은 OBJECT).

OBJECT - result will be output as a numerically indexed array of row objects.
OBJECT_K - result will be output as an associative array of row objects, using first columns values as keys (duplicates will be discarded).
ARRAY_A - result will be output as an numerically indexed array of associative arrays, using column names as keys.
ARRAY_N - result will be output as a numerically indexed array of numerically indexed arrays.  

참조 : http://codex.wordpress.org/Class_Reference/wpdb


이것은 WordPress 세계에서 유일한 방법입니다.
Raptor

6

STD 클래스 객체를 배열로 변환하는 동안 PHP의 배열 함수를 사용하여 객체를 배열로 캐스팅합니다 .

다음 코드 스 니펫을 사용해보십시오.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

이렇게하면 외부 개체가 배열로 변환되지만 속성도 개체 인 경우 변환되지 않습니다.
Coleman 19

OP의 질문에 따라 그는 한 수준의 개체 구조를 가지고 있습니다. 다음 레벨에서는 다른 foreach 루프를 추가해야합니다.
NJInamdar

3

이것을 시도 할 수 있습니다.

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);

1

Std에서 ArrayObject를 사용하거나 직접 빌드

(새로운 \ ArrayObject ($ existingStdClass))

새 클래스에서 빌드 인 메서드를 사용할 수 있습니다.

getArrayCopy ()

또는 새 개체를

iterator_to_array


경우 $existingStdClass다른 속성 인 갖는다 stdClass재산권 배열 결과에 stdClass를 유지 한 다음이. 재귀 적으로 작동하는 것이 필요하다면 json 기술을 사용해야하는 것 같습니다
Patrick

1

$ post_id가 $ item의 배열이라고 가정하겠습니다.

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

강력한 텍스트


1

배열이 있고 배열 요소가 stdClass항목이면 이것이 해결책입니다.

foreach($post_id as $key=>$item){
    $post_id[$key] = (array)$item;
}

이제는 stdClass새 배열 요소로 배열 내부의 배열로 대체되었습니다.


1

stdClass 객체를 배열로 변환하는 두 가지 간단한 방법이 있습니다.

$array = get_object_vars($obj);

그리고 다른 것은

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

또는 foreach 루프를 사용하여 단순히 배열을 만들 수 있습니다.

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

0

myOrderId($_GET['ID']);다차원 OBJ를 반환 하는 함수 가 있습니다. A와 문자열 .

다른 1 라이너는 나를 위해 워킹되지 않았습니다.

이것은 둘 다 작동했습니다.

$array = (array)json_decode(myOrderId($_GET['ID']), True);

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.