【PHP】全てのペアを取得する関数

PHP

この記事のゴール

  • 配列要素の全てのペアを取得する関数の仕組みがわかる

コード

まずはコードを見てみましょう。

このコードを pairs.php とでも命名します。

Gistに掲載しておきました。

実行してみましょう。

$ php -f pairs.php
A, B
A, C
A, D
A, E
B, C
B, D
B, E
C, D
C, E
D, E

A, B, C, D, E の5個の要素の全ての組み合わせが表示されました。

アルゴリズムの確認

では、アルゴリズムの確認をしていきます。

function pairs(array $items)
{
    if (count($items) < 2) {
        throw new \Exception("Too few elements.");
    }

関数pairs は 配列変数 $items を引数とし、

$items は要素数が2以上である必要があります。

    $pairs = [];
    $lastIndex = count($items) - 1;

ペアを格納する $pairs を初期化し、配列 $items の最後のインデックスを取得しています。

    for ($x = 0; $x < $lastIndex; $x++) {
        for ($y = $x + 1; $y <= $lastIndex; $y++) {
            $pairs[] = [$items[$x], $items[$y]];
        }
    }

$x について、0 から $lastIndex のひとつ手前まで 1 刻みでループを回します。

$y については、 $x + 1 から $lastIndex まで 1 刻みでループを回します。

配列 $pairs に、配列 [$items[$x], $items[$y]] を追加しています。

このループで生成される $x と $y は、5個の要素の配列を $items として渡した場合

$x, $y
0, 1
0, 2
0, 3
0, 4
1, 2
1, 3
1, 4
2, 3
2, 4
3, 4

となります。これら $x, $y を配列の引数として使っています。

つまり、$pairs の中身は、

A, B
A, C
A, D
A, E
B, C
B, D
B, E
C, D
C, E
D, E

となります。

    return $pairs;
}

関数 pairs の最後に $pairs を返して終了しています。

呼び出し側を見てみます。

$items = ['A', 'B', 'C', 'D', 'E'];
$pairs = pairs($items);
array_map(function ($pair) {
    echo implode(', ', $pair) . "\n";
}, $pairs);

配列 $items に要素を格納します。

関数 pairs から結果を取得し、配列 $pairs に格納します。

array_map 関数を使って、配列 $pairs の各要素について

コールバック関数を適用し、配列の内容をカンマつなぎで表示しています。

コメント

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