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
関数を効果的に活用しましょう。
コメント