【PHP】配列・連想配列からランダムに要素を取得する

公開日:
更新日:
カテゴリー: PHP

PHPにおいて、ランダムに配列・連想配列から要素を取得する方法をまとめています。

既にある関数を使ってランダムに要素を取得する方法と、単純なコードを使って取得する方法を載せています。

「array_rand」関数を使う

array_rand関数は、ランダムに一つ以上の配列のキー(要素ではない)を返す関数です。

第2引数を「3」にすると、ランダムな3つのキーを「配列として」返します。

array_rand ( ここに配列, ここに取り出したい数 );

なお、第2引数に配列の要素以上の数値を指定すると、E_WARNINGレベルのエラーが発生し、NULLを返します。

 

では、array_rand関数を使って、配列からランダムに要素を取得したいと思います。

1
2
3
4
5
6
7
8
9
10
11
//配列&連想配列
$array_1 = array( "大野智", "櫻井翔", "相葉雅紀", "二宮和也", "松本潤" );
$array_2 = array( "Ohno" => "大野智", "Sakurai" => "櫻井翔", "Aiba" => "相葉雅紀", "Ninomiya" => "二宮和也", "Matsumoto" => "松本潤");
 
//「array_rand」関数を使ってランダムなキーを取得
$randkey_1 = array_rand( $array_1, 1 );
$randkey_2 = array_rand( $array_2, 1 );
 
//配列からランダムな要素を取得(ここでは出力)
echo $array_1[$randkey_1];
echo $array_2[$randkey_2];

これを実行すると次のようになるので、配列でも連想配列でもランダムに配列の要素を取得できます。

二宮和也
相葉雅紀

「shuffle」関数を使う

次に、shuffle関数を使う方法でやってみたいと思います。

shuffle関数は、その名の通り、配列をシャッフルする方法です。

shuffle( ここに配列 );

shuffle関数は、引数に与えられた配列の要素をシャッフルして、シャッフルされた後の配列を返します(成功した場合はtrue、失敗した場合はfalseを返します)。

 

では、shuffle関数を使って、配列からランダムに要素を取得したいと思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//配列&連想配列
$array_1 = array( "大野智", "櫻井翔", "相葉雅紀", "二宮和也", "松本潤" );
$array_2 = array( "Ohno" => "大野智", "Sakurai" => "櫻井翔", "Aiba" => "相葉雅紀", "Ninomiya" => "二宮和也", "Matsumoto" => "松本潤");
 
//配列をシャッフル
if( shuffle($array_1) ){
    //シャッフル成功
        //念のため配列の中身をチェック
        print_r($array_1);
 
        //配列からランダムな要素を取得(ここでは出力)
        echo $array_1[0];   //シャッフルされたので配列のキーは何でもいい
}else{
    //失敗
}
 
//連想配列をシャッフル
if( shuffle($array_2) ){
    //シャッフル成功
        //念のため連想配列の中身をチェック
        print_r($array_2);
 
        //配列からランダムな要素を取得(ここでは出力)
        echo $array_2[0];   //シャッフルされたので配列のキーは何でもいい(!後述!)
}else{
    //失敗
}

これを実行すると、このようになります。

Array
(
    [0] => 松本潤
    [1] => 二宮和也
    [2] => 相葉雅紀
    [3] => 櫻井翔
    [4] => 大野智
)

松本潤

Array
(
    [0] => 大野智
    [1] => 相葉雅紀
    [2] => 松本潤
    [3] => 二宮和也
    [4] => 櫻井翔
)

大野智

ここでお気づきになるかと思いますが、実は連想配列をshuffle関数でシャッフルすると、キーがリセットされて混ぜ混ぜされてしまいます

これは注意が必要ですね。

乱数を生成するやり方

count関数で配列の要素数を取得し、その範囲内でrand関数を使ってランダムに要素を取得してみましょう。

1
2
3
4
5
6
7
8
9
10
11
//配列&連想配列
$array_1 = array( "大野智", "櫻井翔", "相葉雅紀", "二宮和也", "松本潤" );
$array_2 = array( "Ohno" => "大野智", "Sakurai" => "櫻井翔", "Aiba" => "相葉雅紀", "Ninomiya" => "二宮和也", "Matsumoto" => "松本潤");
 
//ランダムな数を生成(配列のキーは0からスタートするのでマイナス1をする)
$random_number_1 = rand(0, count($array_1)-1);
$random_number_2 = rand(0, count($array_2)-1);
 
//配列からランダムな要素を取得(ここでは出力)
echo $array_1[$random_number_1];
echo $array_2[$random_number_2];//これは失敗する

これを実行すると、このようになります。

二宮和也
null ※キーが存在しないため

まとめ

配列からランダムに要素を取り出す方法を3つ見てきましたが、最後の方法は自分がやってしまいそうな方法ですが、連想配列の場合は注意が必要となります。

また、shuffle関数での方法は連想配列が崩れます。

こう考えると、やはりarray_rand関数での方法が一番最適なような気がします。

配列からランダムに要素を取り出す際に、「なぜarray_rand関数はキーを返すのか?要素を直接くれたらいいのに」と思っていましたが、なるほど納得です。

 

あわせて読んでほしい!

 

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント