14

オブジェクトが非常にきれいになり、PHP 5ではオブジェクトを使用してもパフォーマンスが低下しないため、PHPで配列を使用することから離れ始めています。

現在、私がやっている方法は次のとおりです。

$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));

ただし、型キャストは再帰的ではないため、毎回型キャストする必要があるのはとても面倒です...

php でこのようなことを行う方法はありますか (またはありますか)。

$object = {
    'this' => 'that',
    'foo' => {
        'bar' => 123
    }
};
4

6 に答える 6

39

PHP 5.4 から、短い配列構文が使用可能になりました。これにより、次のように配列を初期化できます。

$myArray = ["propertyA" => 1, "propertyB" => 2];

PHP7 の時点で、PHP には現在短いオブジェクト構文はありません。ただし、短い配列構文をキャストして、次のようなオブジェクトを作成できます。

$myObject = (object) ["propertyA" => 1, "propertyB" => 2];

次の構成を使用するよりもはるかに見栄えがよく、短く見えます。

$myObject = new \StdClass();
$myObject->propertyA = 1;
$myObject->propertyB = 2;
于 2016-03-22T15:29:25.413 に答える
5

関数 width StdClassを構築することをお勧めします。

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;
    }
}
于 2012-11-16T13:10:08.477 に答える
3

PHP は現在、短いオブジェクト構文をサポートしていません。PHP 5.4 以降では、短い配列構文がサポートされています。おそらく5.5には、あなたが求めているものが含まれるでしょう。

別の方法として:

オブジェクトを JSON として作成し、以下を使用できますjson_decode()

$json = '{"this": "that", "foo": {"bar": 123}}';
var_dump(json_decode($json));

注:これは、質問を解決する方法のデモンストレーションとしてのみ示しています。私はそのような慣行を提唱しているわけではありません。

于 2012-11-16T13:43:38.803 に答える
1

既に構築されたアレイを受け取った場合の代替ソリューションがあります。配列に n 個のネストされた配列があるため、それぞれを単純な方法でキャストする機会がないとします。これはトリックを行います:

$object = json_decode(json_encode($unknownArray));

これは、配列シンタックスに固執してそれと一緒に暮らすよりもはるかに遅いため、大きなループなどでは使用しません。また、配列の要素が関数またはその他の面白いものである場合、これはそれを壊します。

使用例:

$unknownArray = array(
    'a' => '1',
    'b' => '2',
    'c' => '3',
    'd' => array(
        'x' => '7',
        'y' => '8',
        'z' => '9',
    ),
);
$object = json_decode(json_encode($unknownArray));
echo $object->d->x;
于 2016-06-10T17:03:50.300 に答える
0

stdClass残念ながら、そのようなインスタンスを作成する構文はありません。newただし、キーワードと任意のsplクラスを使用できます(私が認めるほどきれいではありません)。キーストロークを最適化する場合は、次のような小さなヘルパー関数を作成できます。

function O($a){
    return new ArrayObject($a); // has -> and [] support too
}

そして書く

$stuff = O(array('a' => 'tickle me elmo', 'b' => O(array('foo' => 'bar'))));
于 2012-11-16T13:11:39.070 に答える
0

正直なところ、なぜこれをやりたいのかわかりませんが(連想配列は本質的に data-only-objects です)、主張する場合:
すべての配列をすべての単一レベルでオブジェクトにキャストする代わりに、使用できます次の「トリック/ハック」 :

$object = json_decode(
              json_encode(
                   array('some'=>array('multi'=>'Dimensional'),
                         'array'=>'that',
                         'you' => array('want' => 'to',
                                        'turn' => 'into'),
                         'an' => 'object')));

これにより、すべての配列が のインスタンスに変換されますstdClass。これは、あなたが望んでいたものだと思います。
繰り返しますが、PHP はJavaScript ではなく、オブジェクトは PHP のような言語では (相対的に言えば) はるかに高価ですが、JS の場合はそうです。オブジェクトが必要ない場合は、連想配列の使用に固執することを強くお勧めします。

オブジェクトと同様に、配列はタイプヒントにすることができます:function foo (array $argument){}
本当にそれらを何らかのクラスの特定のインスタンスに変換したい場合は、配列を処理するためにコンストラクターを変更しないでください:

class My_Object extends stdClass
{
    public function __construct(array $params = null)
    {
        if (!empty($params))
        {
            foreach ($params as $name => $value)
            {
                $this->{$name} = $value;//set everything
            }
        }
    }
}

そして、ロットに追加したいメソッドを追加していきます

于 2012-11-16T13:29:02.350 に答える