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

PHP

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

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

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

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

PR

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

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

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

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

<?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"
  }
}

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

PR

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」が出力されて、ちゃんと渡った数字で計算されていることが確認できました。

コメント

Ads Blocker Image Powered by Code Help Pro

広告ブロッカーが検出されました。

ブラウザの拡張機能を使用して広告ブロックをしていることが確認できました。 ブラウザの広告ブロッカー機能を無効にしていただくか、codelikes.comをホワイトリストに追加し、更新をクリックしてください。 お手数ですが、よろしくお願いします🙇‍♂️
タイトルとURLをコピーしました