【PHP】配列・連想配列からランダムに要素を取得する
PHPにおいて、ランダムに配列・連想配列から要素を取得する方法をまとめています。
既にある関数を使ってランダムに要素を取得する方法と、単純なコードを使って取得する方法を載せています。
「array_rand」関数を使う
array_rand関数は、ランダムに一つ以上の配列のキー(要素ではない)を返す関数です。
第2引数を「3」にすると、ランダムな3つのキーを「配列として」返します。
array_rand ( ここに配列, ここに取り出したい数 );
なお、第2引数に配列の要素以上の数値を指定すると、E_WARNINGレベルのエラーが発生し、NULLを返します。
では、array_rand関数を使って、配列からランダムに要素を取得したいと思います。
//配列&連想配列 $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関数を使って、配列からランダムに要素を取得したいと思います。
//配列&連想配列 $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関数を使ってランダムに要素を取得してみましょう。
//配列&連想配列 $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関数はキーを返すのか?要素を直接くれたらいいのに」と思っていましたが、なるほど納得です。
あわせて読んでほしい!
コメント
まだコメントはありません。