PHPの配列の値を展開(アンパック)する…演算子について

PHP

PHPの配列の値を展開できる...演算子の使い方について書いています。
スプレッド演算子と呼ばれることもあります。

今回は...演算子を使って、下記の挙動を確かめます。

・配列で…演算子を使って内容をマージする
・自作関数の引数に使って、可変引数を作る
・関数呼び出しの引数にして、呼び出しを簡略化する

載せているサンプルコードはPHPのバージョン8.1.8で確認しています。
それでは、確認していきましょう。

配列での…演算子の使い方は?

...演算子は配列の前につけて使うことができます。
公式のドキュメントのこちらに記載があります。
配列の前につけて使用すると、演算子をつけた配列の内容を展開してくれます。

…演算子を使ってマージする

例えば、下記のように配列の内容を展開して、マージすることが可能です。

<?php
$fruits1 = ['orange', 'apple'];
$fruits2 = ['grape', 'banana'];
$fruits3 = ['lemon', 'peach'];

$fruits = [...$fruits1, ...$fruits2, ...$fruits3];
var_dump($fruits);

$fruits1, $fruits2, $fruits3という、文字列が2つずつの配列を作成しました。
それぞれの配列を...演算子で展開して、$fruits配列を作成しています。

こうすると、1から3の配列の中身がすべて$fruitsに展開されます。
var_dump関数で出力して確認すると、下記のようにフラットな配列として、マージされました。

array(6) {
  [0]=>
  string(6) "orange"
  [1]=>
  string(5) "apple"
  [2]=>
  string(5) "grape"
  [3]=>
  string(6) "banana"
  [4]=>
  string(5) "lemon"
  [5]=>
  string(5) "peach"
}

…演算子を付けなかったらどうなる?

...演算子を付けたことで、フラットな配列になりましたが、何もつけなかった場合には入れ子になります。
下記は、同じ配列を...演算子を付けずに、ひとつの配列にしたものです。

$fruits = [$fruits1, $fruits2, $fruits3];
var_dump($fruits);

var_dump関数で出力すると、下記のように階層構造になりました。

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(6) "orange"
    [1]=>
    string(5) "apple"
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "grape"
    [1]=>
    string(6) "banana"
  }
  [2]=>
  array(2) {
    [0]=>
    string(5) "lemon"
    [1]=>
    string(5) "peach"
  }
}

このように...演算子を付けることで、配列の内容を展開できます。

array_merge関数とは違うのか?

配列のマージはarray_merge関数でも行うことができます。
先ほどのプログラムをarray_merge関数で行うと、下記のようになります。

<?php
$fruits1 = ['orange', 'apple'];
$fruits2 = ['grape', 'banana'];
$fruits3 = ['lemon', 'peach'];

$fruits = array_merge($fruits1, $fruits2, $fruits3);
var_dump($fruits);

$fruits1, $fruits2, $fruits3の配列をarray_merge関数でマージしています。
var_dump関数で出力すると、下記のようになります。

array(6) {
  [0]=>
  string(6) "orange"
  [1]=>
  string(5) "apple"
  [2]=>
  string(5) "grape"
  [3]=>
  string(6) "banana"
  [4]=>
  string(5) "lemon"
  [5]=>
  string(5) "peach"
}

このようにarray_merge関数でマージした場合も同じ挙動になります。

自作関数の引数で…演算子を使う

自作した関数の引数に...演算子を使うことで、可変長の引数を作成することができます。

可変長は、渡す引数の数が決まっていないことです。
1つ渡してもいいし、3つや5つなど複数増やすこともできる引数です。
公式のドキュメントでは、このあたりに記載があります。

可変長引数のみを用意した関数

例えば、下記のように使うことで、引数が可変長になります。

function output(...$params) {
    var_dump($params);
}

output("hello", "test", 123);

output関数を作って、渡す引数の$paramsが可変長です。
output関数を呼び出すときに、3つの引数を渡して呼び出しています。

var_dump関数で出力すると、下記のように、渡した引数が配列として受け取れていることが確認できました。

array(3) {
  [0]=>
  string(5) "hello"
  [1]=>
  string(4) "test"
  [2]=>
  int(123)
}

固定引数の後に、可変長引数を用意した関数

固定長の引数を書いた後に、可変長の引数を書くことができます。

function outputFruits($title, ...$fruits) {
    echo "--- {$title} ---\n";
    foreach($fruits as $fruit) {
        echo "{$fruit}\n";
    }
}

outputFruits("フルーツ出力", "orange", "banana", "apple");

outputFruits関数を作りました。

最初の引数は固定で$title変数で受け取ります。
第2引数には可変引数の$fruits変数を用意しました。

処理の内容は$title変数の文字列を最初に出力しています。
その後に可変長の引数で渡された、$fruitsをforeach文でループして、出力しています。

呼び出し時の最初の引数に「フルーツ出力」を渡して、その後にの「orange, banana, apple」を渡しています。
出力結果を確認すると、下記のようになります。

--- フルーツ出力 ---
orange
banana
apple

このように固定長の引数をいくつか定義した後に、可変長の引数を書くこともできます。

関数を呼び出すときに…演算子を使う

関数の呼び出し時に…演算子を使うこともできます。
例えば、下記のように使います。

function addThreeNumbers($num1, $num2, $num3) {
    echo $num1 + $num2 + $num3;
}

$params = [10, 20];
addThreeNumbers(20, ...$params); // 50

addThreeNumbers関数を作成しました。
3つの引数の値を足して、表示するだけの関数です。

2つの数値を入れた$params配列を作りました。
その次の行で、addThreeNumbers関数を呼び出しています。

第1引数に20を渡して、第2・第3引数は$params配列を展開して渡しています。
このように配列の値を...演算子を使うことで、引数に展開して渡すことも可能です。

結果、「50」が出力されて、ちゃんと渡った数字で計算されていることが確認できました。

コメント

タイトルとURLをコピーしました