Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】shuffle()関数の使い方

shuffle関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

shuffle関数は、配列の要素をランダムな順序に並び替える関数です。引数として与えられた配列そのものを変更し、並び替え後の配列を返却するのではなく、成功した場合はTRUE、失敗した場合はFALSEを返します。

この関数は、配列内のデータの順序を無作為化する必要がある場合に役立ちます。例えば、カードゲームのシミュレーションでカードの山をシャッフルしたり、複数の選択肢をランダムな順番で表示したりする際に利用できます。

shuffle関数を使用する際には、引数として渡す配列が参照渡しされる点に注意が必要です。つまり、関数内で配列が直接変更されるため、元の配列の内容が上書きされます。元の配列の内容を保持したい場合は、shuffle関数を呼び出す前に配列のコピーを作成し、コピーに対してshuffle関数を適用する必要があります。

shuffle関数は、配列の要素を並び替える際に、疑似乱数生成器(PRNG)を使用します。PHPのバージョンによっては、PRNGのシード値を設定することで、shuffle関数の挙動を制御できる場合があります。しかし、セキュリティが重要な場面では、より強力な乱数生成器を使用することを推奨します。

shuffle関数は、配列のキーと値の関連性を維持しません。並び替え後、キーは数値として再割り当てされます。もし、キーと値の関連性を維持したまま配列をランダムに並び替えたい場合は、uksort関数やuasort関数などの、ユーザー定義の比較関数を使用するソート関数を検討する必要があります。

構文(syntax)

1shuffle(array &$array): bool

引数(parameters)

array &$array

  • array &$array: シャッフルする配列。この引数は参照渡しされ、関数実行後に元の配列が変更されます。

戻り値(return)

true

配列の要素をランダムに並び替えることに成功した場合は true を返します。

サンプルコード

PHP shuffle連想配列の挙動

1<?php
2
3/**
4 * PHPのshuffle関数が連想配列に適用された際の動作を示すサンプルコードです。
5 * shuffle関数は配列の値をランダムな順序に並べ替えます。
6 * しかし、連想配列に適用すると元のキーは失われ、値のみがシャッフルされた数値添字配列になります。
7 */
8function demonstrateShuffleWithAssociativeArray(): void
9{
10    // 元の連想配列を定義します。
11    $originalArray = [
12        'apple' => 100,
13        'banana' => 150,
14        'orange' => 120,
15        'grape' => 200,
16    ];
17
18    echo "元の連想配列:\n";
19    print_r($originalArray);
20
21    // shuffle関数を適用します。
22    // この関数は配列を直接変更(参照渡し)します。
23    // 連想配列に適用すると、キーは破棄され、値だけがシャッフルされます。
24    $success = shuffle($originalArray);
25
26    echo "shuffle関数適用後の配列 (成功: " . ($success ? 'true' : 'false') . "):\n";
27    print_r($originalArray);
28
29    // [ポイント]
30    // 上記の出力結果から、元の連想配列のキーは失われ、
31    // 値のみがシャッフルされて新しい数値添字配列になったことが確認できます。
32    // もしキーと値のペアを維持したままシャッフルしたい場合は、別の方法が必要です。
33}
34
35// サンプル関数の実行
36demonstrateShuffleWithAssociativeArray();
37
38?>

PHPのshuffle関数は、指定された配列の要素の順序をランダムに並べ替えるための関数です。引数として渡すarray &$arrayは、配列を直接変更する「参照渡し」であることを意味しており、関数実行後に元の配列の内容が更新されます。戻り値は常にtrueであり、シャッフル処理が成功したことを示します。

このサンプルコードは、shuffle関数を連想配列に適用した場合の具体的な動作を示しています。連想配列に対してshuffle関数を実行すると、元のキーはすべて失われます。その代わりに、配列の値のみがランダムな順序で並べ替えられ、自動的に0から始まる新しい数値添字が割り当てられた配列に再構築されます。

したがって、もし元の連想配列のキーと値のペアの関係を維持したまま要素の順序をランダムにしたい場合は、shuffle関数は適切な選択肢ではありません。その場合は、array_keysarray_randなどを組み合わせるなど、キーと値の関連性を保持する別の方法を検討する必要があります。この挙動は、shuffle関数を利用する上で特に注意すべき重要な点です。

PHPのshuffle関数は、引数として渡された配列の内容を直接変更(参照渡し)する破壊的な関数です。特に、連想配列に適用すると、元のキーは完全に失われ、値のみがシャッフルされた数値添字配列へと変換されます。キーと値のペアを維持したまま要素をランダムに並べ替えたい場合には、この関数は適しません。その際は、array_rand関数などを用いてキーをランダムに取得し、それに基づいて並べ替えるといった別の手段を検討する必要があります。関数は処理成功時にtrueを返しますが、配列が確実に変更される点に注意して利用してください。

PHP shuffleで多次元配列をシャッフルする

1<?php
2
3/**
4 * PHPのshuffle関数が多次元配列にどのように作用するかを示すサンプルコード。
5 *
6 * shuffle関数は、配列の最上位の要素の順序をランダムに変更します。
7 * 多次元配列に適用した場合、ネストされた配列そのものが要素として扱われ、
8 * それらのネストされた配列の順序がシャッフルされます。
9 * ネストされた配列の「内部」の要素はシャッフルされません。
10 */
11function demonstrateMultidimensionalShuffle(): void
12{
13    echo "--- シャッフル前の多次元配列 ---" . PHP_EOL;
14
15    // 例として多次元配列を定義
16    $multidimensionalArray = [
17        ['apple', 'banana', 'cherry'],
18        ['dog', 'elephant'],
19        ['flower', 'garden', 'house', 'ice'],
20        ['jellyfish']
21    ];
22
23    // シャッフル前の配列の内容を表示
24    print_r($multidimensionalArray);
25
26    // 多次元配列に shuffle 関数を適用
27    // shuffle 関数は参照渡しで配列を受け取り、元の配列を直接変更します。
28    // 成功時には true を返しますが、通常は戻り値を明示的にチェックする必要はありません。
29    shuffle($multidimensionalArray);
30
31    echo PHP_EOL . "--- シャッフル後の多次元配列 ---" . PHP_EOL;
32
33    // シャッフル後の配列の内容を表示
34    print_r($multidimensionalArray);
35
36    echo PHP_EOL . "注意: shuffle関数は多次元配列の最上位の要素(この例では内側の配列全体)のみをシャッフルします。" . PHP_EOL;
37    echo "内側の配列の要素の順序は変更されません。" . PHP_EOL;
38}
39
40// 関数の実行
41demonstrateMultidimensionalShuffle();
42

PHPのshuffle関数は、指定された配列の要素の順序をランダムに並べ替えるために使用されます。引数にはarray &$arrayとあるように、対象となる配列を参照渡しで受け取ります。そのため、関数を呼び出すと、引数として渡された元の配列が直接変更されます。戻り値は常にtrueであり、シャッフルが成功したことを示します。

このサンプルコードでは、多次元配列にshuffle関数を適用した場合の挙動を示しています。shuffle関数は、多次元配列に対しては、配列の最上位の要素のみをシャッフルします。つまり、内側に含まれる個々の配列そのものが一つの要素として扱われ、それらの内側の配列全体の順序がランダムに入れ替わります。サンプルコードの実行結果からもわかるように、シャッフル後も各内側の配列(例えば['apple', 'banana', 'cherry'])の内部の要素の順序は変更されません

したがって、多次元配列を扱う際には、shuffle関数が最上位の構造のみに作用し、ネストされた配列の内部までは影響しない点を理解しておくことが重要です。

shuffle関数は、多次元配列に適用した場合、その配列の最上位の要素の順序のみをランダムに変更します。内側の配列の要素の順序はシャッフルされず、内側の配列自体が丸ごと移動することにご注意ください。多次元配列のすべての階層をシャッフルしたい場合は、内側の配列に対しても個別にshuffle関数を適用する必要があります。引数で渡された配列は参照渡しのため、元の配列が直接変更されます。元の配列の順序を保持したい場合は、関数を呼び出す前に配列をコピーして使用してください。関数の戻り値は成功時にtrueですが、通常は確認不要です。

PHP shuffle()で配列を偏りなく並べ替える

1<?php
2
3/**
4 * PHPのshuffle()関数を使用して配列の要素をランダムに並べ替えるデモンストレーションを行います。
5 *
6 * shuffle()関数は、与えられた配列の要素をインプレースで(参照渡しによって元の配列を直接変更し)
7 * ランダムな順序に並べ替えます。この関数は、統計的な偏りがないように設計されており、
8 * 信頼性の高い乱数生成器を使用して要素の順序を決定します。
9 * 成功した場合は常にtrueを返します。
10 */
11function demonstrateArrayShuffle(): void
12{
13    // シャッフルする配列を定義します。
14    $cards = ['♠A', '♠K', '♠Q', '♠J', '♠10', '♡A', '♡K', '♡Q', '♡J', '♡10', '♢A', '♢K', '♢Q', '♢J', '♢10', '♣A', '♣K', '♣Q', '♣J', '♣10'];
15
16    echo "シャッフル前のカード配列:\n";
17    print_r($cards);
18
19    // 配列の要素をランダムな順序に並べ替えます。
20    // shuffle()関数は内部的に偏りのない乱数生成器を使用しており、
21    // 特定の順序に偏ることがないように設計されています。
22    // 戻り値は常にtrueですが、ここでは確認のために変数に格納しています。
23    $success = shuffle($cards);
24
25    echo "\nシャッフル後のカード配列 (shuffle()の戻り値: " . ($success ? 'true' : 'false') . "):\n";
26    print_r($cards);
27
28    // 複数回実行することで、毎回異なる順序でシャッフルされることを確認できます。
29    echo "\nもう一度シャッフル後のカード配列:\n";
30    shuffle($cards);
31    print_r($cards);
32}
33
34// デモンストレーション関数を実行します。
35demonstrateArrayShuffle();
36
37?>

PHPのshuffle()関数は、配列の要素をランダムな順序に並べ替えるために使用されます。この関数は、引数として渡された配列の要素の順序を直接変更します。引数はarray &$arrayと定義されており、これは配列が「参照渡し」されることを意味します。そのため、関数内で配列が変更されると、その変更は元の配列にも反映されます。

shuffle()関数は、統計的な偏りがないように設計されており、信頼性の高い乱数生成器を使用して要素の順序を決定します。これにより、特定の要素の並び順に偏りが生じることなく、公正にシャッフルされることが保証されます。

関数の処理が成功した場合、shuffle()は常にtrueを返します。この戻り値は、シャッフル操作が問題なく完了したことを示します。サンプルコードでは、カードの配列がshuffle()関数によってどのように並べ替えられるかを示しています。シャッフル前とシャッフル後の配列を比較することで、要素がランダムに再配置され、毎回異なる順序になることが確認できます。システム開発において、データのランダム化が必要な場面で幅広く利用できる便利な関数です。

shuffle()関数は、引数として渡された配列そのものの要素をランダムな順序に並べ替えます。新しい配列が返されるわけではありませんので、シャッフル前の元の配列が必要な場合は、事前にarray_slice()やスプレッド演算子などで配列のコピーを作成しておく必要があります。この関数の戻り値は、シャッフルが成功したことを示すtrueが常に返されます。したがって、戻り値でシャッフル処理の成否を判断する用途には適していません。shuffle()関数は内部的に統計的な偏りのない乱数生成器を使用しており、要素の出現順序に特定の偏りが生じる心配はありません。安心してデータのランダム化に利用できます。

PHP shuffle 連想配列のキー消失と再割り当て

1<?php
2
3/**
4 * PHPのshuffle関数を連想配列に適用した場合の動作を示すサンプルコードです。
5 *
6 * PHPのshuffle関数は配列の値をランダムな順序に並べ替えます。
7 * しかし、連想配列に適用した場合、元のキーは破棄され、
8 * 値のみがシャッフルされ、新しい数値添字 (0, 1, 2...) が自動的に割り当てられます。
9 * 通常、連想配列のキーと値の関連付けを維持したままシャッフルしたい場合は、
10 * この関数は適切ではありません。
11 */
12function demonstrateShuffleWithAssociativeArray(): void
13{
14    // サンプルの連想配列を定義します。
15    $associativeArray = [
16        'apple'  => 'リンゴ',
17        'banana' => 'バナナ',
18        'cherry' => 'サクランボ',
19        'date'   => 'ナツメヤシ',
20    ];
21
22    echo "--- シャッフル前の配列 ---\n";
23    print_r($associativeArray);
24
25    // shuffle関数を適用します。
26    // 成功した場合はtrueを返します。配列自体が参照渡しで変更されます。
27    $success = shuffle($associativeArray);
28
29    echo "\n--- シャッフル後の配列 ---\n";
30    print_r($associativeArray);
31
32    if ($success) {
33        echo "\n配列のシャッフルは成功しました。\n";
34        echo "注意: 元の連想配列のキーは失われ、値のみがシャッフルされ、\n";
35        echo "新しい数値添字 (0, 1, 2...) が自動的に割り当てられています。\n";
36    } else {
37        echo "\n配列のシャッフルは失敗しました。\n";
38    }
39}
40
41// 関数を実行します。
42demonstrateShuffleWithAssociativeArray();

PHPのshuffle関数は、配列の要素をランダムな順序に並べ替えるために使用されます。引数array &$arrayは、並べ替えの対象となる配列を「参照渡し」で受け取ります。これにより、関数が実行されると、引数に渡した元の配列自体が直接変更されます。この関数は常にtrueを戻り値として返し、配列のシャッフルが成功したことを示します。

特に注意すべきは、連想配列にshuffle関数を適用した場合の挙動です。サンプルコードが示すように、連想配列に対してこの関数を使用すると、元のキーは破棄され、値のみがランダムに並べ替えられます。そして、新しくゼロから始まる数値添字(0, 1, 2...)が自動的に割り当てられます。そのため、連想配列のキーと値の関連付けを維持したまま要素をシャッフルしたい場合には、この関数は適切ではありません。サンプルコードは、シャッフル前の連想配列と、キーが失われ数値添字に変わったシャッフル後の配列を比較することで、この重要な特性を具体的に示しています。

PHPのshuffle関数は、引数に渡された配列の要素をランダムな順序に並べ替えますが、元の配列が直接変更される点に注意が必要です。特に連想配列に適用すると、元のキーはすべて破棄され、値のみがシャッフルされた後に、自動的に新しい数値添字(0, 1, 2...)が割り当てられます。このため、キーと値の関連付けを維持したまま要素をシャッフルしたい場合には、この関数は適切ではありません。連想配列のキーと値のペアを保ちたい場合は、別の処理方法を検討してください。

関連コンテンツ

関連プログラミング言語