it-swarm-ja.tech

PHPの配列のようなオブジェクトを初期化しますか?

PHPでは、次の表記法を使用して、配列を値ですばやく初期化できます。

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....

sTDClassオブジェクトに対してこれを行う方法はありますか?私は退屈より短い方法を知りません

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
27
Pekka 웃

両方の型キャストと再帰関数の使用 を示す投稿から、1次元配列と多次元配列を標準オブジェクトに変換します。

<?php
function arrayToObject($array) {
    if (!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
        foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) {
                $object->$name = arrayToObject($value);
            }
        }
        return $object;
    }
    else {
        return FALSE;
    }
}

基本的に、$arrayを受け入れ、そのすべてのキーと値を反復処理する関数を作成します。キーを使用して、値をクラスプロパティに割り当てます。

値が配列の場合は、関数を(再帰的に)再度呼び出し、その出力を値として割り当てます。

上記のサンプル関数はまさにそれを行います。ただし、ロジックの順序は、プロセスについて自然に考えるのとは少し異なる可能性があります。

8
Tim Lytle

型キャストを使用できます。

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );
40
Gumbo

私はまた、ガンボを推奨される解決策として賛成票を投じましたが、彼が提案したのは正確には尋ねられたものではないため、_member1o_が_member1a_に似ている理由について混乱が生じる可能性があります。

これを明確にするために、phpで同じstdClassを生成する2つの方法(5.4以降では3つの方法)を使用します。

  1. 質問の長いまたは手動のアプローチによると:

    _$object = new stdClass;
    $object->member1 = "hello, I'm 1";
    $object->member1o = new stdClass;
    $object->member1o->member1 = "hello, I'm 1o.1";
    $object->member2 = "hello, I'm 2";
    _
  2. Gumboの提案によると、配列からオブジェクトをキャストするための短いバージョンまたは1行のバージョン(ここではわかりやすくするために拡大)。

    _$object = (object)array(
         'member1' => "hello, I'm 1",
         'member1o' => (object)array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    );
    _
  3. PHP 5.4+短縮された配列宣言スタイル

    _$object = (object)[
         'member1' => "hello, I'm 1",
         'member1o' => (object)['member1' => "hello, I'm 1o.1"],
         'member2' => "hello, I'm 2",
    ];
    _

どちらもまったく同じ結果になります:

_stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)
_

nJoy!

25
nickl-

使用できます:

$object = (object)[]; // shorter version of (object)array();

$object->foo = 'bar';
6
Sparkup

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

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}
5
outis

from this 同様の質問への回答:

PHP7以降、 Anonymous Classes があり、追加のプロパティの設定を含め、実行時にクラスを拡張できます。

$a = new class() extends MyObject {
    public $property1 = 1;
    public $property2 = 2;
};

echo $a->property1; // prints 1

配列の初期化子ほど簡潔ではありません。それを使うかどうかわからない。しかし、はあなたが検討できる別のオプションです

4

私はDictという名前のクラスを使用します。

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}

他のオブジェクトや配列とマージするための関数もありますが、それはこの質問の範囲外です。

4
gnud

別のオプション 深い 変換はjson_encode + json_decodeを使用することです(デフォルトでstdClassにデコードされます)。これにより、ネストされた各オブジェクトで(object)キャストを繰り返す必要がなくなります。

$object = json_decode(json_encode(array(
     'member1' => "hello, I'm 1",
     'member1o' => array(
         'member1' => "hello, I'm 1o.1",
     ),
     'member2' => "hello, I'm 2",
)));

出力:

php > print_r($object);
stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)
2
Artur Klesun