PHPのshuffle関数の使い方!配列の要素をランダムに並べ替える

PHPの shuffle関数は、配列のすべての要素をランダムな順序に並べ替えるために使用されます。

クイズの選択肢をランダムにする、表示するコンテンツの順序を毎回変えるなど、要素の順序を予測不可能にしたい場合に役立ちます。
この記事では、shuffle関数の基本的な使い方、引数、戻り値、キーの扱いや空の配列に対する挙動、そして使用する際の注意点について解説します。

shuffle関数の基本的な構文

shuffle 関数の基本的な構文は以下の通りです。

shuffle(array &$array): bool
  • $array: シャッフルしたい配列です。この配列は参照渡し& 記号)されるため、関数が実行されると元の配列が直接変更されます

shuffle関数の戻り値

処理が成功した場合は true、失敗した場合は false が返されます。

shuffle関数を使ってみる

実際にshuffle関数を使用して動作を確認してみます。

例1:数値配列のシャッフル

数値配列を用意して、配列の要素をシャッフルします。

<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

echo "--- シャッフル前 ---" . PHP_EOL;
print_r($numbers);

shuffle($numbers); // 配列をシャッフル

echo "--- シャッフル後 ---" . PHP_EOL;
print_r($numbers);
// 出力例(実行ごとに結果は異なる):
// --- シャッフル前 ---
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )
// --- シャッフル後 ---
// Array ( [0] => 7 [1] => 3 [2] => 9 [3] => 1 [4] => 5 [5] => 2 [6] => 8 [7] => 4 [8] => 6 )
?>

配列の中身をprint_r関数で出力した後に、shuffle関数を使って配列をシャッフルしています。
シャッフルされた後に配列を出力すると、要素の順序が変わり、キーが「0」から振り直されていることがわかります。

例2:文字列配列のシャッフル

文字列の配列をシャッフルしてみます。

<?php
$fruits = ['apple', 'banana', 'orange', 'grape', 'kiwi'];

echo "--- シャッフル前 ---" . PHP_EOL;
print_r($fruits);

shuffle($fruits); // 配列をシャッフル

echo "--- シャッフル後 ---" . PHP_EOL;
print_r($fruits);
// 出力例(実行ごとに結果は異なる):
// --- シャッフル前 ---
// Array ( [0] => apple [1] => banana [2] => orange [3] => grape [4] => kiwi )
// --- シャッフル後 ---
// Array ( [0] => kiwi [1] => orange [2] => apple [3] => grape [4] => banana )
?>

$fruits配列をshuffle関数に渡して、シャッフル前後を比べてみました。
文字列の配列でも同じように要素がシャッフルされて、キーが振りなおされていることが確認できます。

例3:連想配列をシャッフルした場合の注意点

連想配列にshuffle関数を使用したときです。
shuffle は、連想配列のキーを破棄し、数値インデックスに再割り当てします。

元のキーと値の関連性を保持したい場合は、shuffle は適していません。

<?php
$userScores = [
    'Alice' => 95,
    'Bob' => 80,
    'Charlie' => 70,
    'David' => 90
];

echo "--- シャッフル前 ---" . PHP_EOL;
print_r($userScores);

shuffle($userScores); // 連想配列をシャッフル

echo "--- シャッフル後 ---" . PHP_EOL;
print_r($userScores);
// 出力例(実行ごとに結果は異なる):
// --- シャッフル前 ---
// Array ( [Alice] => 95 [Bob] => 80 [Charlie] => 70 [David] => 90 )
// --- シャッフル後 ---
// Array ( [0] => 80 [1] => 95 [2] => 90 [3] => 70 )
?>

$userScores配列は連想配列になっています。
キーは文字列になっています。この配列にたいしてshuffle関数を実行しています。

配列の処理前後を比べると文字列のキーが破棄されて、数値のキーに振りなおされていることが確認できます。
この例からわかるように、連想配列のシャッフル後には元のキー(Alice, Bobなど)が失われ、値だけがランダムな順序で数値インデックスに割り当てられています。

shuffle関数を使う際の注意点

shuffle関数を使う際の注意点です。

元の配列が変更される(破壊的)

shuffle関数は、引数として渡された配列を直接変更します。
元の配列の順序を保持したい場合は、事前に array_merge([], $original_array)array_values($original_array) などで配列のコピーを作成してから shuffle を適用してください。

キーが失われる

shuffle関数は、配列の要素を並べ替える際に、すべてのキーを破棄し「0」から始まる新しい数値インデックスを割り当てます。
連想配列のキーと値の関連性を保持したい場合は、shuffle関数は使用できません。

そのような場合は、キーをランダムに選択する array_randを使用するか、カスタムのソートロジックを実装する必要があります。

乱数の質

shuffle関数は、PHPの組み込み乱数ジェネレーターを使用します。
これは、一般的な用途には十分ですが、暗号学的に安全な乱数が必要な場合は、random_int関数やrandom_bytes関数などの関数を検討してください。

空の配列に対する挙動

空の配列をshuffle関数に渡してもエラーにはなりません。
trueが返され、配列は空のままです。

<?php
$empty = [];

$result = shuffle($empty);

var_dump($result); // true
var_dump($empty);  // []

shuffleとarray_randとmt_randの違い

関数 目的 戻り値 元の配列の変更 キーの扱い
shuffle 配列全体の要素の順序をランダムに並べ替える true または false する キーは失われ、数値に再割り当て
array_rand 配列からランダムなキーを選択する 選択されたキー(またはキーの配列) しない キーを返す
mt_rand 単一の乱数を生成する 生成された乱数(整数) 該当なし 該当なし

使い分けの目安

  • shuffle: 配列の要素の順序を完全にランダムにしたい場合。特に、元のキーの関連性が不要な場合(例: カードデッキ、クイズの選択肢の並べ替え)。
  • array_rand(): 配列からランダムな要素を1つまたは複数選びたいが、元の配列の順序は変えたくない場合、または連想配列のキーと値の関連性を保持したい場合。
  • mt_rand(): 特定の範囲で単一の乱数が必要な場合。

まとめ

PHPの shuffle 関数は、配列の要素をランダムに並べ替えるためのシンプルかつ強力な関数です。
クイズの選択肢のランダム化など、多くの場面で役立ちます。

しかし、元の配列が変更されること、そしてキーが失われるという破壊的な性質を理解して使用することが重要です。
これらの注意点を踏まえ、目的に応じて shuffle関数を効果的に活用しましょう。

PHP

コメント