オブジェクトを配列に変換するにはどうすればよいですか?


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

これは可能ですか?

回答:


133

プロパティはプライベートとして宣言されているため、get_object_varsを確認する必要があります。クラス内でこれを呼び出して、結果を返す必要があります。

文字列などのプリミティブデータ型の場合はうまく機能しますが、ネストされたオブジェクトでどのように動作するかはわかりません。

あなたの場合、あなたは次のようなことをしなければなりません。

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

385

1次元配列

1次元配列を変換するために、Benoitが彼の回答で述べた (array)orが使用してキャストできますget_object_vars

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

5
最初のソリューションは多次元を処理しませんでしたが、2番目のソリューションはうまくいきました。
2012年

1
2番目の解決策は、json_decode()に2番目のパラメーターがあることを思い出させてくれました。
タイラー

1
なぜこの回答が非常に多くの票を獲得しているのでしょうか。どちらのソリューションも、get_object_varsよりも不明確できれいです
RJD22

3
@ RJD22:私はそれをより「事実上の」リソースにするために私の回答を更新しました。うまくいけば、あなたは今それをその賛成票に値すると見なすでしょう。;-)コメントがここで参照する「2番目のソリューション」はJSONソリューションであり、私の最初の回答の2番目であるということを他のすべての人に注意してください。
アンディE

驚くばかり!私は解決策に驚き、スクロールしてこれを見つけました!
eozzy 2016

44

JSONエンコード/デコード関数の動作に依存することで、深くネストされたオブジェクトを連想配列にすばやく変換できます。

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

2
これがこの問題に対する最も簡単な答えです。それを使用し、それは素晴らしい働きをしました。ありがとう
Dustin Fraker

7
ただメモ-これは、配列にUTF8の有効なデータが含まれている場合に機能します。配列に他のエンコーディングが含まれている場合(Win1250など)、json_encodeが失敗するので失敗します(php 5.3)
Radek

それをオブジェクトに戻す方法は?
Pmpr 2017年

@Trixは再びjsonを使用しますjson_decode(json_encode($ array)、FALSE);これも(再帰的に)すべてのサブ配列をオブジェクトに変換します
Mufaddal

私はこれを二度以上強めたいと思います。
JohnFF、2017年

34

注意:

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

オブジェクトのキャスト結果の配列を読み取ることができません:codepad.viper-7.com/AkX5pqこれについて何か説明がありますか?
ダミアン2013年

1
私はこの答えが一番好きです。Andy Eの再帰関数は基本的に同じことを行いますが、これは理解しやすいと思います。
HartleySan 2014

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

foreachオブジェクトを使用していくつかの方法を試しましたが、これは私が見た中で最も簡単でクールな回避策です。たった1行:)


パブリックオブジェクト属性でのみ完璧に機能します。プライベートのものは考慮しません。
リモン14年

ここにJsonSerialize関数の使用に関するいくつかの説明がありますが、1行のソリューションではなく、私が読んだのは良い習慣ではありません: ( stackoverflow.com/questions/7005860/…アドバイスをありがとう
m3nda

それをオブジェクトに戻す方法は?
Pmpr 2017年

18

シンプルなバージョン:

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

2

これを試して:-

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

2

同じ問題があり、上記のget_object_varsで解決しました。

さらに、json_decodeを使用してオブジェクトを変換する必要があり、配列をoldfor "for"ループ(代わりにfor-each)で反復処理する必要がありました。


0

PHPのarray_values()メソッドを使用することもできます


2
できません。「array_values()はパラメーター1が配列であり、オブジェクトが指定されていることを期待しています」
manatwork 2016年

0

この関数をアプリケーション内の別のクラス「HelperFunctions」に分解して、objectToArray()への再帰呼び出しが失敗したため、Andy Earnshawの回答に問題が発生しました。

次のようにarray_map呼び出し内でクラス名を指定することで、これを克服しました。

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

私はコメントでこれを書いたでしょうが、まだ十分な評判がありません。


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

関数は何も返しません。それが機能する方法はありません!
Rotimi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.