サイトアイコン よろずメモ 学び 稼ぎ 趣味 YOROZUMEMO

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

普段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

 

 

モバイルバージョンを終了