PHPのランダム関数使い分け。壊れないように注意しよう

投稿日: 2011/11/14  更新日: 2022/09/17

PHP 


PHPで配列からランダムに値を取りたいときはどうしたら良いでしょうか?

標準関数にはarray_rand()shuffle()の2つの関数があります。

2つの関数は微妙に挙動が違うので、注意が必要です。

使い方を間違えると、元の配列が壊れてしまう可能性があります。


では実際にそれぞれを見比べてみましょう。




array_rand()の使い方

array_rand(array $array, int $num = 1): int|string|array

パラメータ

第一引数arrayは配列を渡します。
第二引数numは取得する要素の数を指定します。


戻り値

戻り値は、シャッフル後の配列を返します。
取得する要素が1つの場合はキーを返し、2つ以上の場合はキーの配列を返します。


コード例

$fruits = array(
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'caviar',
);

// 配列をランダムに並び変える
var_dump(array_rand($fruits));
var_dump(array_rand($fruits, 2));

実行結果

string(1) "b"

array(2) {
    [0]=>
    string(1) "b"
    [1]=>
    string(1) "c"
}

ランダムに1つ抽出する場合は素直なコードですが、2つ以上抽出する場合はその後の扱いを気を付けましょう


shuffle()の使い方

shuffle(array &$array): bool

パラメータ

引数arrayは配列を渡します。 参照渡しで渡した配列をシャッフルします。


戻り値

戻り値は、シャッフルが成功した場合trueを、失敗した場合falseを返します。


コード例

$fruits = array(
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'caviar',
);

// 配列をランダムに並び変える
shuffle($fruits);
var_dump($fruits);

実行結果

array(3) {
    [0]=>
    string(6) "caviar"
    [1]=>
    string(5) "apple"
    [2]=>
    string(6) "banana"
}

注意すべきは、元の連想配列のキーがなくなり連番になっている点です。


ではどちらを使えばよいか

両者はそれぞれやりたいことが異なります。


array_rand()は、キーを返します。

配列の中から何かひとつを抽出する場合、役に立つでしょう。


shuffle()は、配列全体をシャッフルします。

配列を並び変える場合、役に立つでしょう。


たとえばゲームを作るときは次のように使い分けます。

  • ガチャのように確率を引いたり、NPCが毎回しゃべるセリフを変える場合、array_rand()を使う。
  • パーティーの順番を入れ替えたり、マス目に配置する障害物の位置を毎回変えたり、パズルやトランプの配布を変える場合、shuffle()を使う。

仕様により複雑なランダム性が求められることは多々ありますので、一概に標準関数だけを使うわけではありませんので参考まで。
※ダンジョンとか


両者関数は、値渡しと参照渡しとで性質が異なりますので、同じノリで使わないようご注意ください。



このエントリーをはてなブックマークに追加     

profile
profile

洋ちゃん

@c5apple

システムエンジニアをしています。二児の父です。

夢は天井から床までビッシリ並んだ本棚のある書斎を作ること!