配列を極める1 phpで漢数字(大数>万進)単位で表示する

お金の単位を万、億、兆、京、垓、といった万単位の漢字で表すのを万進というのだそうですが、お金の表示とかで結構使うのに割とphpのプログラム例がなかったので作りました。※全部漢数字にするプログラムは良く見かけます。

実用的な範囲として垓まで対応。無量大数まで対応してもいいですが、基本的にないでしょう。対応したい人はmb_substrの部分を配列に置き換えるなどしてください。ラムダ関数(function())を使っているのでphp4の人はcreate_functionに置き換えてくだしあ。

php manshin_format.php 123456789                                                                          
123456789

array_reduceのよいサンプルです。ラムダ関数内でstatic使っているのがポイントです。

アルゴリズムの流れとしては数字を文字列として
文字列反転>4文字ずつに切り出して配列化する。
array_reduceで結合する時にラムダ関数内で呼び出し回数に応じて、漢字の単位を追加する。

といった流れです。

<?php

function manshin_format($number){
  return array_reduce(
    str_split(strrev($number),4),
      function($x,$y){
        static $i=0;
        $i++;
        return (($y==0)?'':strrev($y)
              .(($i==1)?'':mb_substr('万億兆京垓',$i-2,1,'utf-8'))).$x;
      }
   );
}

echo manshin_format($argv[1])."\n";

尚、array_reduceはcallback関数と組み合わせて、特定のカラムのsum値を求めたりする時に使う配列関数です。
SQLで言うところのGROUP BYみたいなものです。これを使ってSUM,AVG,MIN,MAXなどを再現することもできます。

SELECT SUM(lot) FROM item_lot; 
<?php
$arr= array(
  array('item_id'=35,'lot'=>25),
  array('item_id'=45,'lot'=>75),
);

$sum = array_reduce($arr,function($x,$y){
  return $x+$y['lot'];
}

echo $sum;

SQLの後処理で配列を操作しなければならなくなった時とかに便利です。