PHPでスマートにスワップ(値の入れ替え)をする方法

PHPに限らずスワップ(値の入れ替え・交換)は頻繁に使いますが、定番の書き方といえばこんな感じですよね。

$hoge = 'hoge';
$fuga = 'fuga';

// swap
$temp = $hoge;
$hoge = $fuga;
$fuga = $temp;

説明するまでもないですが、テンポラリ変数(この場合 $temp)を利用して一時的に$hogeの値を$tempに退避させ、$hogeに$fugaの値をコピー、最後に$fugaに$temp(元々の$hogeの値)を入れることで値が入れ替わるという単純明快な書き方です。これはもう、僕も昔から、それこそBASICでプログラミングの勉強というのを始めた頃から使っていた方法です。

今までこれ以外のスワップの書き方なんて考えたこともなかったんですが、PHPだと1文で済ませることができるんですね。有名なテクニックみたいですが、僕はPHP歴はまだそれほどでもないし、ちょっと「ほほう」とか思ったので(笑)

さすがにswapみたいな関数が用意されてるわけではなく、list関数を使います。

// swap (PHP)
list($fuga, $hoge) = array($hoge, $fuga);

list関数は、1つ以上の変数に配列のインデックスを割り当てる関数です。$hoge, $fugaと並んでいる配列を、$fuga, $hogeの順にlist関数で代入できるわけですが、なるほど確かにスワップに使えますね。

そういえば、Perlでもこんな書き方できましたよね。人の作った掲示板のCGIいじるくらいしか使ったことないんで間違ってたらごめんなさい。

# swap (Perl)
($fuga, $hoge) = ($hoge, $fuga);

こっちはもっとスッキリしてますね。

PHPやPerlでしか使えない書き方よりも従来のテンポラリ使う書き方で充分だとは思うんですが、例えば3つ以上の変数の入れ替えをすることがあっても一度で済むのでスマートですね。でもまー、あまり機会ないかなあ…

// swap 3values (PHP)
list($fuga, $puge, $hoge) = array($hoge, $fuga, $puge);

とにかくlist使う方法はちょっと目からウロコでした。今度使ってみよう(笑)