配列をランダムに並べ替える関数を作ってみた【Javascrip/PHP】
Javascript/PHPで配列をランダムにしたい場面が有ったので、配列をランダムに並び変える関数を作ってみました。通常のホームページ作成で使う機会はそんなに無いと思いますが、Javascript/PHPでミニゲーム等作るときには結構使う機会があると思います。
配列をランダムに並び変える関数(Javascript)
メインの関数
1 2 3 4 5 6 7 8 9 |
function muuRdm(rdm){ var obj = []; for (var i = 0, l = rdm.length; i < l; i++){ var num = Math.floor(Math.random()*(l-i)); obj.push(rdm[num]); rdm.splice(num, 1); } return obj; } |
関数の簡単な流れ
- 「obj」という名前の、ランダムにした要素を入れていく箱を用意する。
- 「Math.random()」を使って配列から要素を1個取り出す。
- 取り出した要素を「obj」に入れる。
- また2番目に戻って配列の中身が空になるまで繰り返す。
- 全て終わったら「obj」を戻す。
関数へ配列を渡す
1 2 |
var rdm = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; rdm = muuRdm(rdm); |
この様に、配列を引数にして関数へ渡します。そして戻ってきたランダムになった配列を入れ直します。
これで中身はランダムにシャッフルされた状態になっています。
動きのサンプル
- 準備中。
0~9までの数字をランダムに並び変えて、それを10回繰り返し表示させています。
「ランダム」と書かれているボタンをクリックすると再度ランダムにして表示させます。
1 2 3 4 |
<ul id="random"> <li>処理中。。。</li> </ul> <p><button id="randomTestBtn">ランダム</button></p> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
var randomTestFunc = function (){ var randomTest = function(){ var txt = ""; for (var i = 0; i < 10; i++){ var rdm = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; rdm = muuRdm(rdm); txt += '<li>'; for (var j = 0, len = rdm.length; j < len; j++){ txt += rdm[j]; }; txt += '</li>'; }; document.getElementById('random').innerHTML = txt; }; var randomTestBtn = document.getElementById('randomTestBtn'); if (document.addEventListener){ randomTestBtn.addEventListener('click', randomTest, false); }else if(document.attachEvent){ randomTestBtn.attachEvent('onclick', randomTest); }; randomTest(); }; randomTestFunc(); |
配列をランダムに並び変える関数(PHP)
メインの関数
1 2 3 4 5 6 7 8 9 10 |
function muuRdm($rdm){ $obj = array(); $l = count($rdm) - 1; for ($i = 0; $i <= $l; $i++){ $num = mt_rand(0, $l-$i); array_push($obj, $rdm[$num]); array_splice($rdm, $num, 1); } return $obj; } |
基本的な流れはJavascriptの場合と同じです。
関数へ配列を渡す
1 2 |
$rdm = array(0,1,2,3,4,5,6,7,8,9); $rdm = muuRdm($rdm); |
動きのサンプル
- 準備中。
処理の仕方、HTMLのソース等、Javascriptの場合と同じなので省略します。
※表示の仕方で、非同期通信(XMLHttpRequest)を使ってphpファイルとやり取りをしているので、「ランダムボタン」を押してから表示されるまで若干のラグがあります。
コメントを残す