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

作成日: 更新日:

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

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

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

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

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

基本的な使い方

構文(syntax)

shuffle(array &$array): bool

引数(parameters)

array &$array

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

戻り値(return)

true

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

サンプルコード

PHP shuffle連想配列の挙動

<?php

/**
 * PHPのshuffle関数が連想配列に適用された際の動作を示すサンプルコードです。
 * shuffle関数は配列の値をランダムな順序に並べ替えます。
 * しかし、連想配列に適用すると元のキーは失われ、値のみがシャッフルされた数値添字配列になります。
 */
function demonstrateShuffleWithAssociativeArray(): void
{
    // 元の連想配列を定義します。
    $originalArray = [
        'apple' => 100,
        'banana' => 150,
        'orange' => 120,
        'grape' => 200,
    ];

    echo "元の連想配列:\n";
    print_r($originalArray);

    // shuffle関数を適用します。
    // この関数は配列を直接変更(参照渡し)します。
    // 連想配列に適用すると、キーは破棄され、値だけがシャッフルされます。
    $success = shuffle($originalArray);

    echo "shuffle関数適用後の配列 (成功: " . ($success ? 'true' : 'false') . "):\n";
    print_r($originalArray);

    // [ポイント]
    // 上記の出力結果から、元の連想配列のキーは失われ、
    // 値のみがシャッフルされて新しい数値添字配列になったことが確認できます。
    // もしキーと値のペアを維持したままシャッフルしたい場合は、別の方法が必要です。
}

// サンプル関数の実行
demonstrateShuffleWithAssociativeArray();

?>

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

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

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

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

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

<?php

/**
 * PHPのshuffle()関数を使用して配列の要素をランダムに並べ替えるデモンストレーションを行います。
 *
 * shuffle()関数は、与えられた配列の要素をインプレースで(参照渡しによって元の配列を直接変更し)
 * ランダムな順序に並べ替えます。この関数は、統計的な偏りがないように設計されており、
 * 信頼性の高い乱数生成器を使用して要素の順序を決定します。
 * 成功した場合は常にtrueを返します。
 */
function demonstrateArrayShuffle(): void
{
    // シャッフルする配列を定義します。
    $cards = ['♠A', '♠K', '♠Q', '♠J', '♠10', '♡A', '♡K', '♡Q', '♡J', '♡10', '♢A', '♢K', '♢Q', '♢J', '♢10', '♣A', '♣K', '♣Q', '♣J', '♣10'];

    echo "シャッフル前のカード配列:\n";
    print_r($cards);

    // 配列の要素をランダムな順序に並べ替えます。
    // shuffle()関数は内部的に偏りのない乱数生成器を使用しており、
    // 特定の順序に偏ることがないように設計されています。
    // 戻り値は常にtrueですが、ここでは確認のために変数に格納しています。
    $success = shuffle($cards);

    echo "\nシャッフル後のカード配列 (shuffle()の戻り値: " . ($success ? 'true' : 'false') . "):\n";
    print_r($cards);

    // 複数回実行することで、毎回異なる順序でシャッフルされることを確認できます。
    echo "\nもう一度シャッフル後のカード配列:\n";
    shuffle($cards);
    print_r($cards);
}

// デモンストレーション関数を実行します。
demonstrateArrayShuffle();

?>

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

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

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

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

【PHP8.x】shuffle関数の使い方 | いっしー@Webエンジニア