238

オブジェクト 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;
        }
    }
4

11 に答える 11

505

怠惰ワンライナー法

わずかなパフォーマンスの低下を厭わない場合は、JSON メソッドを使用してワンライナーでこれを行うことができます (オブジェクトを再帰的に反復処理するよりも高速であると報告されている人もいますが、これはおそらく 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);
于 2013-09-02T15:49:30.833 に答える
98

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

return get_object_vars($booking);
于 2013-11-19T17:50:58.920 に答える
19

キャストする前は配列なので、キャストしても意味がありません。

次のような再帰キャストが必要になる場合があります。

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 オブジェクトを含むことができる複雑な配列でテストされ、使用されています。

于 2013-09-02T15:50:44.750 に答える
17

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

get_object_vars($data)
于 2017-05-11T21:24:23.023 に答える
15

この機能は私のために働いた:

function cvf_convert_object_to_array($data) {

    if (is_object($data)) {
        $data = get_object_vars($data);
    }

    if (is_array($data)) {
        return array_map(__FUNCTION__, $data);
    }
    else {
        return $data;
    }
}

参照: http://carlofontanos.com/convert-stdclass-object-to-array-in-php/

于 2015-01-08T16:04:56.787 に答える
4

グーグルで検索したところ、 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に感謝します。

于 2013-12-27T14:28:26.773 に答える
0

クラスで使用できるカルロの回答のバージョンを次に示します。

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;
    }
}
于 2016-05-17T15:41:14.743 に答える
0

EloquentなしでLaravelで使用する方法は次のとおりです。

function getUsers(){ 

   $users = DB::select('select * from users');       
   $data = json_decode(json_encode($users), true); // to array 

   return view('page')->with('data', $data);
}
于 2021-12-14T09:26:49.463 に答える