配列でも多次元配列でも、ランダムにデータを抽出したい時、配列をシャッフルしてそこから抽出するやり方があります。でも全ての値ではなく指定した数だけ抽出したい時はforeachは使えません。foreachでまわしてその中に分岐を作ってbreakするやり方もあるようですが、ifの分岐ってそこそこ負荷が高かったような・・・例えば
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 | for($i=0; $i<500000; $i++) { $test_array[] = $i; } //50万の数字を入れた配列 $start = microtime(true); //計測スタート $i=1; //ループを抜けるための変数 shuffle($test_array); //シャッフルをここでする foreach($test_array as $value) { //ランダムにした値をまわす if($i >300000) { break; } //30万回まわしたらループを抜ける $i++; //変数を足す } $end = microtime(true); //計測終了 $time = $end - $start; //時間計算 echo $time; //約0.25秒と出ました。 |
結果は約0.25秒。一方でarray_rand()を使った場合、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | for($i=0; $i<500000; $i++) { $test_array[] = $i; } //50万の数字を入れた配列 $start = microtime(true); //計測スタート $random =array_rand($test_array,300000); //ランダムに3万を抜粋 foreach ($random as $value) { //ランダムにした値をまわす } $end = microtime(true); //計測終了 $time = $end - $start; //時間計算 echo $time; //約0.11秒と出ました。 |
約0.11秒。比べると早いのはarray_rand()です。スクリプトもスマートだし。でもそれでも他の言語に比べると遅いんだろうな・・・
よかブロで自分の事を書くとこんな記事ばかりになります・・・