2021/05/29
意外と知らない?!PHPのスプレッド構文
スプレッドという単語自体を聞いた事がない方は多いのではないでしょうか。
今回はそんなスプレッドについてご紹介したいと思います。
スプレッドとは?
スプレッドとは主に、スプレッド演算子と呼ばれる「…」の事を指します。
※Googleのスプレッドシートではありません。
この「…」については見た事がある方はいるのではないでしょうか?
主な用途としましては、
- 関数を作成した際の引数を無限
- 関数の呼び出しの際に、引数をカンマ区切りで入れないといけないものを配列で入れる
といった事ができます。
使用例
百聞は一見しかず….という事で実際にどんな書き方をするのか見てみましょう。
関数を作成した際の引数を無限
/**
* 引数に入れられたものを全て表示
* @param array $params
* @return void
*/
function test(... $params) { // ←「...」と記述する事で引数を無限に
foreach($params as $value) {
echo $value;
}
}
test('一番目にechoする', '2番目にecho', 'こんな感じで引数を幾つでもかけます'); // ←引数を幾つでも
この様な感じで引数を幾つでも書く事ができます。
関数呼び出し側で書いた引数は全て、test関数の第一引数に配列(Array)で来ます。
その為、foreachなどで再帰処理を行う事が出来ます。
これは、よく使われるvar_dumpとかと一緒ですね。
この使い方に関しては、正直あまり使い所がない様な気がしています。
直接Arrayを渡してしまえば良い為、スプレッド構文にする必要がないのです。
関数の呼び出しの際に、引数をカンマ区切りで入れないといけないものを配列で入れる
/**
* メンバーリストを取得
* @param array $where
* @return array
*/
function get_member($where) {
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$sql = 'SELECT * FROM `member`';
$sql_where = '';
foreach($where as $key => $value) {
if ($sql_where) {
$sql_where .= ' AND ' . $key . ' = ?';
} else {
$sql_where .= ' WHERE ' . $key . ' = ?';
}
}
$sql .= $sql_where;
$stmt = $mysqli->prepare($sql);
/*
* bind_paramの第二引数以降はスプレッドで引数無限
* その為、カンマ区切りで引数を指定するのが本来の使い方だが
* array_valuesで値だけの配列を取得し、スプレッドで配列を渡している
*/
$stmt->bind_param(str_repeat('s', count($where)), ...array_values($where));
// 下記が本来の使い方
// $stmt->bind_param('ss', '山田太郎', 'yamada@example.com');
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_all(MYSQLI_ASSOC);
}
$members = get_member([
'name' => '山田太郎',
'email' => 'yamada@example.com',
]);
ピンポイント過ぎてイマイチ使い方が分からないかもしれませんが….
こちらに関しては、使い所があります。
引数が無限の関数が存在する場合に、配列で一気に渡してあげる事ができる為、汎用性がある書き方を出来ます。
上の例で言うと、メンバーリストを取得するのに検索条件が増えた際に、呼び出し側の第一引数の配列に条件を加えるだけで済みます。
他の使い方
主だった使用例は上の2つになるかとは思いますが、少し変わった使い方も出来ます。
例えば、配列の結合です。
よくある書き方
$arr1 = ['banana', 'orange', 'apple'];
$arr2 = ['peach', 'watermelon'];
$result = array_merge($arr1, $arr2);
スプレッド使った書き方
$arr1 = ['banana', 'orange', 'apple'];
$arr2 = ['peach', 'watermelon'];
$result = [...$arr1, ...$arr2];
上の2つの結果は次の様になります。
array(5) {
[0]=>
string(6) "banana"
[1]=>
string(6) "orange"
[2]=>
string(5) "apple"
[3]=>
string(4) "peach"
[4]=>
string(10) "watermelon"
}
意外とこちらの方が使える場面が多いかもしれませんね。
紹介できるのは以上になります。
ちなみにスプレッド構文は、JavaScriptでも使用する事が出来ます。
JavaScriptで使い方はこちらをご参照下さい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax
他の言語は使えるかわからないです….
これ以外の使える書き方もあるかもしれませんので、気になる方はこの機会に詳しく調べて見て下さい!