ことれいのもり

PHPで変数の値を交換する簡単な方法 list()と参照渡し

はじめに

この記事では、PHPで2つの変数の中身を入れ替える方法を紹介します。

C++などの他の言語にあるswap関数のようなものはPHPにはありませんが、簡単に実現できます。

方法を2つ紹介するのでぜひ参考にしてください。

前提

PHP 4.0以降

list: https://www.php.net/manual/ja/function.list.php

1. 推奨:list()を使う

PHPのlist()を使う方法です。

この方法が一番簡単かつ短く書くことができます。

list()について

PHPのlist()を使うと、配列から値を順番に取り出して変数に代入できます。

記述方法は以下の通りです。

list($変数1, $変数2, ...) = $配列;


例えばフルーツの中身が格納されている配列 fruits の中身を、それぞれ別の変数に格納してみます。

$fruits = ["apple", "orange", "peach"];

list($a, $b, $c) = $fruits;

echo $a . PHP_EOL; // apple
echo $b . PHP_EOL; // orange
echo $c . PHP_EOL; // peach


注目すべきポイントは、list()を使っている部分です。

list($a, $b, $c) = $fruits;


この部分は、配列の中身を一つずつ変数に代入する処理をしています。

次のコードと同じ意味です。

$a = $fruits[0];
$b = $fruits[1];
$c = $fruits[2];


このような操作を一括で行なってくれるのがlist()です。

今回は3つの変数に代入をしましたが、4つでも5つでも、一行で各変数に代入できます。

変数の値を交換する方法

list()を使えば、2つの変数の値を交換することができます。

さっそくコードを見てみましょう。


$a = 10;
$b = 20;

echo "交換前" . PHP_EOL;
echo "a = " . $a . PHP_EOL; // 10
echo "b = " . $b . PHP_EOL; // 20

// swapする
list($a, $b) = [$b, $a];

echo "交換後" . PHP_EOL;
echo "a = " . $a . PHP_EOL; // 20
echo "b = " . $b . PHP_EOL; // 10


実行結果は以下の通りです。交換されていますね!


list()を使って2つの値を交換する


注目すべきポイントは、list()の部分です。

list()は右辺に渡す配列の値を左辺の変数にコピーします。

そのため、左辺には交換後の値に並び替えた配列を用意します。

// list()の部分の右辺
[$b, $a] → [20, 10] // ここで交換後の配列を用意する


この処理を行なうことで、左辺の変数に順番に代入されます。

$a = 20; // 右辺の配列の「0番目」が代入される
$b = 10; // 右辺の配列の「1番目」が代入される


実際には交換しているというより、代入しているだけですね。

C言語などでは、交換するときに一旦別の値に代入する必要があったため、直感的に理解しにくいです。

一方でPHPのlist()は、見た目をそのまま代入しているので、可読性も向上しています。

さらに、list()は2つの値を交換する以上のこともできます!

応用:3つ以上の交換

list()の良いところは、3つ以上の交換も同じように実装できるところです。

(a, b, c)を(c, a, b)と並び替えたい時を考えてみます。


$a = 10;
$b = 20;
$c = 30;

echo "交換前" . PHP_EOL;
echo "a = " . $a . PHP_EOL;
echo "b = " . $b . PHP_EOL;
echo "c = " . $c . PHP_EOL;

// a→c, b→a, c→b に入れ替え
list($a, $b, $c) = [$c, $a, $b];

echo "交換後" . PHP_EOL;
echo "a = " . $a . PHP_EOL;
echo "b = " . $b . PHP_EOL;
echo "c = " . $c . PHP_EOL;


実行結果は以下の通りです。

3つでも交換されていますね!

list()の引数を増やすことで、複数の値を簡単に交換できます!


list()を使って3つの値を交換する

2. 参照渡しでswap関数を作る

C++のようなswapをPHPで再現したいときは、参照渡しを使うことでも実装できます。

function swap(&$a, &$b)
{
    $temp = $a;
    $a = $b;
    $b = $temp;
}

$a = 10;
$b = 20;

echo "交換前" . PHP_EOL;
echo "a = " . $a . PHP_EOL;
echo "b = " . $b . PHP_EOL;

swap($a, $b);

echo "交換後" . PHP_EOL;
echo "a = " . $a . PHP_EOL;
echo "b = " . $b . PHP_EOL;


実行結果は以下の通りです。


参照渡しの関数を使って2つの値を交換する


この方法でも実装できますが、あまりオススメはできません。

その理由は、以下の通りです。


  • 参照渡し(&)の仕組みを理解していないと、バグを生みやすい
  • PHPではコピーが発生するので、あまりメリットがない


なによりlist()を使えば1行で実装できるので、参照渡しまでして関数化するメリットが薄いです。

C++系からPHPを学ぶ人や、swap関数を作りたいという目的があるなら問題ありません。

普通に使う分にはlist()を使いましょう!

おわりに

今回は、値の交換を実装する方法として、list()と参照渡しの2つを紹介しました。


私自身、以前はC++を勉強していた影響で、swap関数を参照渡しで実装していました。

しかし、実務ではあまり使わないことを知り、調べた結果、PHPではlist()で簡単に値を交換できることを知りました。

私も最初は非効率な方法を使っていたんです・・・。


何が言いたいかというと、自分の知識を使って実装して間違っていても、そこから新たに学べば問題ないということです。

きっと私のように、list()の存在を知らない人がいると思います。

そんな人が、この記事で初めて知って参考になれば嬉しいです!