【PHP】数字を変換するアルゴリズムと応用

こんなアルゴリズムを見つけた。

<?php
/*0を5に変換するアルゴリズムを見つけた。*/
//$d が $y に変換される。
$d= 1002030;
$y= 0;
$z= 1;

while ($d > 0) {
  $x= $d % 10;                  //1の位から
  $x === 0 ? $y= $y + 5 * $z :  //0を見つけたら5にする
             $y= $y + $x * $z;  //それ以外はそのまま
  $d= (int)($d/ 10);
  $z= $z * 10;
}
print $y;                       //1552535

ケタの大きい数($d)を用意して、その中に0があれば5に変換するという、アルゴリズムの基本問題的なもの。

ちょっと応用する

これ、0と5にかかわらずどんな数でも変換できる。

/*ここからはちょっと応用*/
$d= 1002030;
$y= 0;
$z= 1;

$bf= 0;    //ここに変換したい数
$af= 5;    //ここに変換後の数

while ($d > 0) {
  $x= $d % 10;                  //1の位から
  $x === $bf ? $y= $y + $af * $z :  //$bfを見つけたら$afにする
               $y= $y + $x * $z;  //それ以外はそのまま
  $d= (int)($d/ 10);
  $z= $z * 10;
}
print $y;

たとえば

$bf$af$y
091992939
241004030

こんな感じ。

htmlとcssに応用する

ではこれでちょっとおもしろいことができないか試してみる。

まず数を配列に。

$arr = str_split($y);  //(int)$yに型変換されてる
var_dump($arr);

array(7) { [0]=> string(1) “1" [1]=> string(1) “5" [2]=> string(1) “5" [3]=> string(1) “2" [4]=> string(1) “5" [5]=> string(1) “3" [6]=> string(1) “5" } 

うまく配列に落とし込めた。

css用のカラー配列を用意する

$color=['blue', 'navy', 'green', 'yellow',
        'red', 'fuchsia', 'purple', 'olive',
        'black', 'white'];

0〜9の10色の入った配列を用意した。
(これはなんでもオーケー)

  1. blue
  2. navy
  3. green
  4. yellow
  5. red
  6. fuchsia
  7. purple
  8. olive
  9. black
  10. white 今回はこんな感じ

htmlとcssにphpを

<?php
foreach ($arr as $value) {
  print '<div class="c'. $value. '"></div>';
}
 ?>

<style media="screen">
<?php
foreach ($arr as $value) {
  print <<<END
    .c{$value} {
    width: 100px;
    height: 100px;
    margin: 10px;
    display: inline-grid;
    background-color: {$color[$value]};
  }\n
  END;
} ?>
</style>

divブロックをclass値に$arr[]を順番につけながら生成した。
<style>内のbackground-colorは、$color[]の色を$arrに対応づけて生成している。

こんな感じになる。(めっちゃピンクなのは気にしない笑)

番号づけた配色を確認しながらphpを見返してみる。

  1. blue
  2. navy
  3. green
  4. yellow
  5. red
  6. fuchsia
  7. purple
  8. olive
  9. black
  10. white
$d= 1002030;
/*省略*/

$bf= 0;    //ここに変換したい数 //つまり配色
$af= 5;    //ここに変換後の数  //変換後の色

/*省略*/

$y= 1552535;

つまり

[navy, fuchsia, fuchsia, green, fuchsia, yellow, fuchsia]

これを
$bf = 2;
$af = 4; とすると
$y = 1004030; なので

[navy, blue, blue, green, red, yellow, blue]

$bf = 0;
$af = 7; とすると

数字と色の対応づけを作成したら配色の一括変更がさくっと完了できてしまう。

<div>などのhtml要素にあらかじめclass属性を割り当てておけばテーマ色の変更もへっちゃらだ。

まとめ

文字列処理よりも軽量になる数値の計算処理に変更アルゴリズムを通せば処理の軽量化が期待できる。

けれど、配色の種類が10種類までとか、$dがあまりに桁数が大きいと扱えないなどの課題があるので今回の例はひとまずとして配色の用途には不向きかもしれませんね。笑

なにかこう、切り替える対象が少なくて(多くて20くらい?)、切り替え項目が10以下でおさまるものなら存分に力を発揮できる気がします。