php stdClass to array


195

オブジェクトstdClassを配列に変換するのに問題があります。私はこのようにしてみました:

return (array) $booking;

または

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

または

return (array) json_decode($booking);

キャスト前の配列は1つのレコードでいっぱいで、キャストしようとした後は空です。行を削除せずにキャスト/変換する方法は?

キャスト前の配列:

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、アレイ上で実行することは、私にとってかなり絶望的であるように思われます。おそらく、コンピューターの前に長く座っているので、休憩するときがきたのでしょうか。
2013

明確にするために:var_dump($booking);出力NULL
2013

キャストした後、次のように印刷しようとすると、$ booking [0] ['id'] return not me that not exist
Alessandro Minoccheri

興味があるかもしれません:PHPで有用なエラーメッセージを取得する方法?-とにかく、キャストするvar_dump() に頼んでいた。同じ変数名を再利用しないでください。場合は$booking、鋳造の前に何かだった、それはまだその何かする必要があります前に、後で別の何かをキャストしていません。入力変数と処理変数は異なります。そうしないと、そこで行っていることを理解できなくなった問題が発生します。
hakre 2013

質問を短くする(カスタム関数コードを削除するなど)と、下にスクロールせずに受け入れられた回答を確認するのに役立ちます
cnlevy

回答:


432

怠惰なワンライナー方法

わずかなパフォーマンスを失っても構わない場合は、JSONメソッドを使用して1つのライナーでこれを行うことができます(オブジェクトを再帰的に反復するよりも高速であると報告されている人もいます-ほとんどの場合、PHPは関数の呼び出し遅いためです)。「しかし、私はすでにこれをやった」とあなたは言う。厳密には違います- json_decode配列で使用しましたが、json_encode最初にそれをエンコードする必要があります。

必要条件

json_encodeおよびjson_decode方法。これらは、PHP 5.2.0以降で自動的にバンドルされます。古いバージョンを使用している場合は、PECLライブラリもあります(その場合は、実際に PHPインストールを更新する必要があります。5.1のサポートは2006年に終了しました。)


array/ stdClass->の変換stdClass

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

array/ stdClass->の変換array

マニュアルでは、2番目の引数を次のように指定しjson_decodeています。

assocの
場合TRUE、返されたオブジェクトは連想配列に変換されます。

したがって、次の行はオブジェクト全体を配列に変換します。

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

1
場合(array) $booking;var_dumpあるNULL(OPによって書かれたもの)、このコードが返されるかを推測?
2013

@hakre NULL配列としてキャストした後ではないようです。OPは、マニュアルに従って意味のあるNULL使用後の意味だと思いますjsonをデコードできない場合、NULLが返されますjson_decode($array)
h2ooooooo

4
@AlessandroMinoccheriこれまで機能しなかった理由はjson_decode()、配列を使用する前でした。json_decodeJSON文字列で使用する必要があります。したがって、最初にJSON文字列としてエンコードし(json_encode)、次にデコードすると(JSON文字列を使用して)、正常に機能します。
h2ooooooo 2013

3
JSON仕様で定義されていないタイプ(日付など)を失うことを誰もが忘れていましたか?このアプローチを使用する場合は、復活者が必要です。これは、数値、文字列、ブールなどの基本的なタイプがある場合にのみ有効です。
Denis Pshenov 2014年

1
すばらしい答えです。私はjson_decode($ stdClass、true)を使用しています;)
didando8a

68

この関数を使用して、目的のタイプの標準配列を取得します...

return get_object_vars($booking);

19
これは再帰的ではありません
gawpertron 2014年

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オブジェクトで機能するようになりました:)
Vlad Preda

14

次のphp関数を使用して、php stdClassを配列に変換してください

get_object_vars($data)

2
この関数は再帰的ではないことに注意してください。再帰的な解決策については、Carlo Fontanosの回答を参照してください。
コートニーマイル


12

組み込みの型キャスト機能を使用して、単に入力します

$realArray = (array)$stdClass;

1
私はjson_decode / encodeよりもこれを好む、よりきれいな+1
Logan

2
このメソッドはよりクリーンですが、再帰的ではなく、get_object_vars()と同じように機能します。json_decode / encodeメソッドはハックのように感じられますが、再帰的に機能します。
デビー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 2014年

これは私が探していたものです、どうもありがとうございました。

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.