PHPの配列データをランダムでピックアップできるarray_rand()関数

2019年11月8日

PHP テクノロジー プログラミング

一部上場会社のCTOを辞めて、自分の会社を立ち上げて2年以上経ちますが、改めて東京の郊外にある自宅から東京の中心に毎日通勤して、給料を貰うというサラリーマン生活ほど、自分の人生においてあまり意味を成さなかったことを噛み締めていますが、 この間、とある人材紹介会社の方から連絡をもらい、とある上場企業がCTOを探しているとのこと。 色々な企業で適したCTOが獲得できておらず、経営を意識できる技術責任者を採用したいというニーズはその紹介会社以外でも、本当によく話に出るため、年間を通してよくお話をもらうのですが、今回のお話は、年俸3000万円から5000万円ぐらいを考えているという事で、これまでの話の中で最も高額だったのですが、お断りしました。 理由はその企業の従業員平均年収が440万円ぐらいだったので、金をかけて会社にとって重要な技術責任者を採用しようとしている点は理解できるのですが、一般従業員とのあまりの金額の乖離に、おそらく役員報酬がかなり高額で、社内の貧富差が激しいと想像できる事と、 その企業の役員数が15人もいて、1つのサービスを行っているだけの企業としては、あまりにも不釣り合いなその構成に、従業員の定着率事態も低いのではないかと用意に想像できてしまったからですね。 改めて、宝くじ的な就職をするよりは、自分のサービス構築をしていく事の方が、楽しい人生を過ごせるという判断でしたね。 余談が長引きましたが、今回はPHPのarray_rand()関数を初めて使った事による色々な感じをお伝えしたいと思います。

PHPのarray_rand()関数

長年PHPを使っていますが、この関数を初めて使いました。 というのも、あまりこの関数を使うケースを扱わなかったからなのかもしれません。 確かに、ビジネス系のサービス構築をしていたり、データ解析系を行う時に、乱数ってほとんど使わないんですよね。 エンタメ系やゲーム系であれば、もしかしたら使用頻度は高いかもな〜ということを、考えながら、使ってみたんですが、さほど難しくもなく、手軽に使えていい感じですね。 <?php $arr = ["a","b","c","d","e"]; $rnd = array_rand($arr , 2); print_r($rnd); > Array ( [0] => 1 [1] => 4 ) 使ってみていくつか気がついたんですが、取得するのは配列のkey値(順番号)ですが、結果はその昇順になるという点です。 このまま使うと、順位を維持したままの状態なので、さほど乱数っぽく感じられないですね。 そしてこの仕様を考えると、第二引数である、取得する配列の個数をcount($arr)とすると、ランダム要素のない、配列そのままが帰ってきます。 <?php $arr = ["a","b","c","d","e"]; $rnd = array_rand($arr , count($arr)); print_r($rnd); > Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 ) マニュアルページには、関連機能として「shuffle」がリンクされていたので、これと合わせて使うのが通常なのかもしれません。 <?php $arr = ["a","b","c","d","e"]; $rnd = array_rand($arr , count($arr)); shuffle($rnd); print_r($rnd); > Array ( [0] => 4 [1] => 0 [2] => 2 [3] => 3 [4] => 1 ) 結果は出たんですが、このプログラムにおけるarray_randの役割って何なんでしょう??? なんか釈然としないですね。

自作してみる

配列をランダムにピックアップする関数array_randをもう少し使いやすくする関数を作ってみました。 <?php $arr = ["a","b","c","d","e"]; $rnd = array_rand2($arr); print_r($rnd); function array_rand2($arr=array() , $len=0){ if(!count($arr)){return null;} $len = ($len) ? $len : count($arr); $newArr = array(); while(count($newArr) < $len){ $rnd_key = rand(0 , count($arr)-1); array_push($newArr , $arr[$rnd_key]); array_splice($arr , $rnd_key , 1); } return $newArr; } > Array ( [0] => e [1] => d [2] => a [3] => b [4] => c ) key値ではなく、value値を結果に出しましたが、個人的にこっちのほうが、いちいちkeyをvalueに変換して使うよりも使い勝手が良かったので、そうしてみました。 使い方はarray_randと同じなので、よければ使ってみてください。

javascriptでTRY!!!

同じことをjavascriptでやってみました。 function array_rand(arr , len){ if(!arr){return [];} if(typeof arr !== "object" && typeof arr.length === "undefined"){return [];} len = (len) ? len : arr.length; var newArr = []; while(newArr.length < len){ var rnd_key = Math.floor(Math.random() * Math.floor(arr.length-1)); newArr.push(arr[rnd_key]); arr.splice(rnd_key , 1); } return newArr; } > array_rand(["a","b","c","d","e"]); > (5) ["c", "b", "d", "a", "e"] やっぱり自作したほうがしっくり来ますね。

参考ページ

PHPマニュアル https://www.php.net/manual/ja/function.array-rand.php https://www.php.net/manual/ja/function.shuffle.php

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。