PHPの配列の中からランダムに要素を抽出するには、array_rand() という関数を使います。
array_rand()自体は配列の中からランダムにキーを抽出する関数なので、値を取得しようと思ったら取得したキーで値を取りに行く必要があります。
少し手間だと思われた方もいるかもしれませんが、ランダムにキーを取得するので通常の配列でも連想配列でも対応できます。
PHPの配列の中からランダムに要素を抽出するarray_randの使い方
$配列は、要素を取得する元の配列です。
$取得する数は、int型で取得する数を指定します。
戻り値は、抽出した要素のキーを返してくれます。$取得する数が1の場合はキーの型で1件だけ返しますが、2以上の場合は配列で返します。
実際に動かしてみましょう。
1 2 |
$ary = array("東京", "大阪", "北海道", "沖縄"); echo array_rand($ary, 1); |
このように書くと、0~3の数がランダムに返されます。
これはインデックスキーが0~3まであるからですね。
値を取得するには次のように書きます。
1 2 3 |
$ary = array("東京", "大阪", "北海道", "沖縄"); $key = array_rand($ary, 1); echo $ary[$key]; |
これで”東京”, “大阪”, “北海道”, “沖縄”の何れかが取得できます。
array_randで複数件取得する場合は頭から順番になる
array_rand()の第2引数を2以上にしてみましょう。
1 2 3 |
$ary = array("東京", "大阪", "北海道", "沖縄"); $keys = array_rand($ary, 3); var_dump($keys); |
この場合、ランダムに3つのキーを取得します。
結果は次のようになります。
1 2 3 4 5 6 7 8 |
array(3) { [0]=> int(0) [1]=> int(1) [2]=> int(3) } |
配列の要素数が4つなので、0~3のインデックスのうち3つをランダムに返します。
ただし、配列の頭から取得していくようです。
今回は 0,1,3 でしたが、0,2,3 なども取れますが、3,1,2 のように順番もめちゃくちゃになったり重複したりはしません。
上記サンプルコードの場合のパターンは次の通りです。
1 2 3 4 |
0,1,2 0,1,3 0,2,3 1,2,3 |
この結果が想定となるコードを書いている人は問題ないかもしれません。
ですが、そうで無い場合は注意が必要ですね。
配列の要素を全てランダムな順番で取得する方法
配列から複数の要素をランダムに取り出そうとしたとき、array_rand()だと最初に定義した配列の順番に大きく依存してしまいます。
array_rand()で要素が4つある配列から4つの要素をランダムに取得すると元の配列と同じ結果になり全然ランダムじゃないですね。
配列の順番をめちゃくちゃにして取得するにはshuffle()が使えます。
$配列は、順番をめちゃくちゃにする配列です。
戻り値はなく、$配列の配列の順番がめちゃくちゃになります。
実際に動かしてみましょう。
1 2 3 4 |
$ary = array("東京", "大阪", "北海道", "沖縄"); shuffle($ary); var_dump($ary); |
結果は次のようになります。
1 2 3 4 5 6 7 8 9 10 |
array(4) { [0]=> string(6) "沖縄" [1]=> string(6) "大阪" [2]=> string(9) "北海道" [3]=> string(6) "東京" } |
あとはこれをループして頭から取得すれば、ランダムに全ての要素を取得できます。
ループを3回だけにすれば3つだけランダムに取得できます。
1つ問題があるなと思うことは、元の配列の順番をランダムにしてしまうことです。
なので元の配列は元のままにしておきたい場合は別の変数にコピーして使うようにしてください。
まとめ
配列の中身をランダムに取得する方法についてご紹介しました。
不明点や他にやりたいことなどあればご質問ください。
コメントを残す