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()への入力としてフィードして、配列を返します(2番目のパラメーターがTrueの場合、配列が返されることを示します)。
Amal Murali

6
私は手遅れだと知っていますが、なぜ型キャストを使用しないのですか... (配列)$ obj
chhameed

json_decode(json_encode($object), True)foreachループとは異なる配列が返されることがわかりました。foreachループは、OPが要求した形式で配列を返します。
user3442612 2016

1
@NgSekLong:いいえ、違います。
Amal Murali 2018

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を配列に変更するのに最適な関数
Vivek

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へようこそ。それが問題をどのように解決するかを説明するために、答えを少し広げていただけませんか?
ガン-モニカを復活

1次元配列の場合:$ array =(array)$ class; 多次元配列の場合:上からのコード
スタックオーバーフロー2014

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の世界で唯一提案されている方法です。
ラプター

6

STDクラスオブジェクトを配列に変換するとき.phpの配列関数を使用して、オブジェクトを配列にキャストします。

次のコードスニペットで試してください。

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

これは外部オブジェクトを配列に変換しますが、プロパティのいずれかがオブジェクトでもある場合、それらは変換されません。
コールマン、

OPの質問によれば、彼には1つのレベルのオブジェクト構造があります。次のレベルでは、別のforeachループを追加する必要があります。
NJInamdar

3

あなたはこれを試すことができます:

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

1

StdからのArrayObjectの使用または独自の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オブジェクトを配列に変換するには2つの簡単な方法があります

$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を返す関数があります。Stringとして。

他の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.