主に、「お笑い」「ボードゲーム」「フリーランス」「プログラミング」「音楽」を更新しています。

PHPコード実験 1~5の重複していない数字を出す

PHP
普段PHPで開発を行っています。 今日はある数字を出したくてPHPコードで実現してみました。 昔の自分だとどうやってだせばいいだろう。。。と悩んでいるところでしたが、いろんな現場を体験してPHPで開発ができるようになってからはこのようにしていけばいいだろうという構図も頭で組み立てることができるようになりました。 今回はある数字を表示するためにPHPでコードを書いてみました。PHP初心者の方の勉強になればと思い、これからもどんどん紹介していけたらと思います。

実現したかったこと

今回行いたかったことは、1~5までの数字で重複しないものを順番に出していく処理を作成したかったのです。 このような感じです
出したい数字
12345 12354 12435 12453 12534 12543 13245 13254
このように1~5の数字を重複なく並べた数字を出していきたかったです。 用途としましては、完全母音語表というものを以前作成しまして、その表作成に使ったり、他にも何かしらに役立つかも?と思ったからです。 ちなみに完全母音語表はこちら   それでは、出したいものが分かったところPHPコードをお見せしたいと思います。

PHPコード

最初はアルゴリズムを使って、1の位を上げたら、10の位を見て...とかやっていこうと思いましたが、考えていくうちに、行き詰ってしまい、シンプルに1ずつカウントアップしていきながら希望の数字を探そうと考えました。 そして書いたのが下記のコードです。

<?php
//10000以上は明確なのでスタートの数字を10000に設定
$number = 10000;
//排除する数字群の配列を作成
$exclusionNumber = array(0,6,7,8,9);
//55555より下の数字は明確なので55555に達し次第終了
while ($number < 55555){
    $splitNumber = str_split($number);
    //1~5以外の数字が入っている場合に除外する
    if(array_intersect( $splitNumber, $exclusionNumber )){
        $number++;
        continue;
    } 
    //数字内で重複がある場合は除外する
    $value_count = array_count_values($splitNumber); // 各値の出現回数を数える
    $max = max($value_count);
    if($max != 1){
        $number++;
        continue;
    }
    //上記どちらにも該当していない場合出力する
    echo $number;
    echo '<br>';
    $number++;
}
無駄な処理もあるかもですが、コードの解説です。

全体的な処理の流れ

まず10000からスタートして55555で終わる数字の中で探していこうと考えました。 ですので、初期値を10000に設定し、終了はその数字が55555に達したときに処理が終了するようになっています。

1~5以外の数字が入っている場合に排除

まず1~5以外の数字が入っている場合には要件に満たないため、結果から除く処理を行っています。 array_intersect()メソッドが配列同士を判定することができるPHP関数です。 今まで、配列の中にこの値が入っていたらというin_array()はよく目に指定ましたが、配列同士を比べる関数は恥ずかしながら初めて知りました。 最初に設定しておいた、0,1,6,7,8,9のいずれかが1つでも入っていたら、continueして数字に+1を加えて、最初の処理から再度始めます。

数字が重複している場合に排除

上記の数字が入っていない1~5で構成されている整数の中で、重複しているものは省く処理を2番目に行っています。 array_count_values()メソッドで、まず数字を配列にしたものの値をカウントしています。 例えば、11345という数字であれば、 1=>2 3=>1 4=>1 5=>1  という配列を作成します。 そしてそのmax値をとり、1でなければ重複ありとみなし、数字を1加えてまた初めから処理を始めます。

2つの処理に該当しない数字が期待の数字

上記の2回の処理をくぐりぬけた数字が今回ほしい数字ですので、結果を表示してまた初めから処理をしていきます。

結果

それでは上で示したPHPコードを動かして得れた値を記載します。 期待通りの数字が取れたため満足でした!   12345 12354 12435 12453 12534 12543 13245 13254 13425 13452 13524 13542 14235 14253 14325 14352 14523 14532 15234 15243 15324 15342 15423 15432 21345 21354 21435 21453 21534 21543 23145 23154 23415 23451 23514 23541 24135 24153 24315 24351 24513 24531 25134 25143 25314 25341 25413 25431 31245 31254 31425 31452 31524 31542 32145 32154 32415 32451 32514 32541 34125 34152 34215 34251 34512 34521 35124 35142 35214 35241 35412 35421 41235 41253 41325 41352 41523 41532 42135 42153 42315 42351 42513 42531 43125 43152 43215 43251 43512 43521 45123 45132 45213 45231 45312 45321 51234 51243 51324 51342 51423 51432 52134 52143 52314 52341 52413 52431 53124 53142 53214 53241 53412 53421 54123 54132 54213 54231 54312 54321    
タイトルとURLをコピーしました