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

公開日:
更新日:
カテゴリー: 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関数はキーを返すのか?要素を直接くれたらいいのに」と思っていましたが、なるほど納得です。

 

あわせて読んでほしい!

 

コメント

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

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