CoffeeScript、Clojure、ES6およびその他の多くの言語では、オブジェクト/マップなどを次のように分解できます。
obj = {keyA: 'Hello from A', keyB: 'Hello from B'}
{keyA, keyB} = obj
私は list
function をphpで見つけて、配列を次のように分解できます:
$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;
PHPでオブジェクトまたは連想配列を分解する方法はありますか?コアライブラリに含まれていない場合、誰かがスマートヘルパー関数を作成した可能性がありますか?
PHP 7.0以下の場合、list
の機能を超えます。ドキュメントの状態:
listは数値配列でのみ機能し、数値インデックスは0から始まると想定しています。
目的に合ったものの1つは、配列から現在のシンボルテーブルに変数をインポートする extract()
関数です。 list
を使用すると、変数名を明示的に定義できますが、extract()
では、このような自由はありません。
連想配列の抽出
extract
を使用すると、次のようなことができます。
_<?php
$info = [ 'drink' => 'coffee', 'color' => 'brown', 'power' => 'caffeine' ];
extract($info);
var_dump($drink); // string(6) "coffee"
var_dump($color); // string(5) "brown"
var_dump($power); // string(8) "caffeine"
_
オブジェクトの抽出
オブジェクトの抽出はほとんど同じように機能します。 extract
は配列を引数として取るだけなので、オブジェクトのプロパティを配列として取得する必要があります。 _get_object_vars
_ はあなたのためにそれを行います。すべてのpublicプロパティをキーとして、それらの値を値として持つ連想配列を返します。
_<?php
class User {
public $name = 'Thomas';
}
$user = new User();
extract( get_object_vars($user) );
var_dump($name); // string(6) "Thomas"
_
落とし穴
extract()
は、シンボルテーブルにエクスポートされる変数名を明示的に定義できないため、list
と同じではありません。変数名は、デフォルトで配列キーに対応しています。
list
は言語構造であり、extract()
は関数ですextract()
に2番目の引数として渡すことができる_$flags
_パラメータを使用すると、変数が衝突したり無効な場合の動作に影響を与えることができます。しかし、それでもextract()
の仕組みを理解し、それをcautonで使用することが重要です。
これで、list()またはその新しい省略[]構文でキーを指定できるようになりました。これにより、非整数または非順次キーを持つ配列の構造化解除が可能になります。
現在もサポートされている既存のlist()構文の代わりとして、省略形配列構文([])を使用して、割り当て(foreach内を含む)の配列を分解できます。
例えばこれは:
_$test_arr = ['a' => 1, 'b' => 2];
list('a' => $a, 'b' => $b) = $test_arr;
var_dump($a);
var_dump($b);
_
7.1.0以降、以下を出力します
_int(1)
int(2)
_
受け入れられた回答が、省略表記を使用した例、抽出の使用に関するセキュリティの問題、およびIDEの問題です。
PHP 7.1現在、数値配列の破棄( 対称配列の破棄 )は次のようにサポートされています:
<?php
$data = [55, 'John', 'UK'];
[$id, $name] = $data; // short-hand (recommended)
list($id, $name) = $data; // long-hand
アイテムが必要ない場合は、見落とす可能性があることに注意してください。
次のように、連想配列( リスト内のキーのサポート )で配列を破壊することもできます。
<?php
$data = ['id' => 55, 'firstName' => 'John', 'country' => 'UK']
['id' => $id, 'firstName' => $name] = $data; // short-hand (recommended)
list('id' => $id, 'firstName' => $name) = $data; // long-hand
アイテムが必要ない場合は、見落とす可能性があることに注意してください。また、変数名はプロパティ名と異なる場合があります。
残念ながら、オブジェクトの破壊はありません。ただし、 get_object_vars
を使用してオブジェクトを連想配列に変換してから、連想配列の破棄を使用できます。
<?php
class User {
public $id;
public $name;
public $country;
}
$user = new User();
$user->id = 55;
$user->name = 'John';
$user->country = 'UK';
['id' => $id, 'firstName' => $name] = get_object_vars($user)
しかし、これはいくつかのIDE=機能を壊す可能性があります。これらは、PHPStorm 2019.1を使用しているときに気付いたいくつかの問題です。
@var Type
PHPDocsを追加する必要がありますだから私はそれを通常の方法でやることをお勧めします:
$id = $user->id
$name = $user->firstName
extract
は使用しないでください抽出では、すべての変数が常に設定されます。そこでそれを使用することは本当に悪い考えです:
$_GET
、$_POST
など)で使用しないでください。EXTR_SKIP
フラグなどを使用しない限り、すでに使用されている変数と一致するとコードが破損する可能性があります。変数変数は、これを行う1つの方法です。 foreach
はスコープ内に留まるため、次のように配列から変数を明示的に定義できます。
$args = ['a' => 1, 'b' => 2, 'c' => 3];
foreach (['a', 'c'] as $v) $$v = $args[$v];
// $a is 1, $b is undefined, $c is 3
それは本当にきれいではなく、ありがたいことにこれは7.1で https://wiki.php.net/rfc/short_list_syntax によって対処されています。これは['a' => $a, 'c' => $c] = $args;
上記の例では。
7.1にはassoc配列キーとは異なる名前をvarに使用する方法が含まれているため、ここでも私のアプローチを使用すると、これは非常に簡単です。
foreach (['a' => 'eh', 'b' => 'bee'] as $k => v) $$v = $args[$k];
// $eh is 1, $bee is 2