知りたいこと
関数の中で1つずつ丁寧に値を展開しないで済む方法はありますか?
現状のソースコード
以下のように1つずつ丁寧に値を展開する手間をなくしたいという意図です。
php
1$conditions = [ 2 'name' => 'a', 3 'age' => 1, 4]; 5 6hoge($conditions); 7 8function hoge($conditions) { 9 // 1つずつ丁寧に値を展開する手間をなくしたい 10 $name = $conditions['name'] ?? null; 11 $age = $conditions['age'] ?? null; 12 $phone = $conditions['phone'] ?? null; 13 14 // 展開した値を使っていろいろやる 15 var_dump($name, $age, $phone); 16}
実現したいこと
こういう記述が理想です。
php
1function hoge($conditions){ 2 // 1行で済ませたい 3 [$name, $age, $phone] = $conditions; 4 5 // 展開した値を使っていろいろやる 6 var_dump($name, $age, $phone); 7}
JavaScrriptでこういう記述ができたので、phpはどうかと思いました。
JavaScript
1const conditions = { 2 name: 'a', 3 age: 1 4} 5 6hoge(conditions); 7 8function hoge(conditions){ 9 // 1行で済む 10 const {name, age, phone} = conditions; 11 12 // 展開した値を使っていろいろやる 13 console.log({name, age, phone}); 14}
試したこと
以下のextractArrayValues()
を作ってみましたが、$conditions['phone']
の値がないと "Undefined array key 2" のエラーになってしまいます。
(return $conditions[$key] ?? null;
のようにNULL合体演算子を書いているのになぜ "Undefined" なのか・・?)
php
1$conditions = [ 2 'name' => 'a', 3 'age' => 1, 4 'phone' => '090', 5]; 6 7hoge($conditions); 8 9function hoge($conditions) { 10 // 1行で済ませたい 11 [$name, $age, $phone] = extractArrayValues($conditions); 12 13 // 展開した値を使っていろいろやる 14 var_dump($name, $age, $phone); 15} 16 17function extractArrayValues(array $conditions) { 18 return array_map(function($key) use ($conditions) { 19 return $conditions[$key] ?? null; 20 }, array_keys($conditions)); 21}
そして以下のようにextract()
を使うと、いざ値を使うというときに$phone ?? null
を指定しないといいけませんし・・
それにextract()
ではその変数がどこで宣言されたのかわかりにくい点も微妙ですし・・
php
1$conditions = [ 2 'name' => 'a', 3 'age' => 1, 4]; 5 6hoge($conditions); 7 8function hoge($conditions) { 9 // 1行で済ませたい 10 extract($conditions); 11 12 // 展開した値を使っていろいろやる 13 var_dump($name, $age, $phone ?? null); 14}
何か良い方法はないでしょうか?
バージョン
php は 8.2 です。
回答3件
あなたの回答
tips
プレビュー