プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、数値(自然数)の最上位桁以外を0にする
結論から書くと

1文字ずつに分割して最初以外を0に置き換えて再結合する

もしくは

1桁になるように割って小数点以下を切り捨てて元の桁に戻す

とすることで、できました。

それでは詳細を書いていきます。

諸般の事情により

・2→2
・23→20
・456→400
・7890→7000

のように、数値(自然数)の最上位桁以外を0にしたかったのです。

やり方はいろいろあるだろうけど、どうしようね(--?と
5分くらい考えたところ、以下の2通りのやり方を思いつきました。

1.1文字ずつに分割して最初以外を0に置き換えて再結合する
2.1桁になるように割って小数点以下を切り捨てて元の桁に戻す


せっかくなので、両方やってみましょう。

前提条件は

・「$indata」に元の数字(456とか)が入っている
・「$indata」の整合性チェック(数値チェックとか)は済んでいる
・「$outdata」に結果を入れる

です。

まずは「1文字ずつに分割して最初以外を0に置き換えて再結合する」からやります。

……(--)

できた!φ(--)

$outdata = "";
foreach(str_split($indata) as $value){
    if($outdata == ""){    //最上位桁
        $outdata .= $value;
    }else{    //最上位桁以外
        $outdata .= "0";
    }
}

簡単に説明しておくと

foreach(str_split($indata) as $value){



str_split($indata)

で「$indata」を文字列として1文字ずつに分割しています。
「456」なら「4」と「5」と「6」に分けているわけです。

その結果をforeachで回すことによって、1文字ずつ処理しています。
あとはループの中の

if($outdata == ""){    //最上位桁
    $outdata .= $value;
}else{    //最上位桁以外
    $outdata .= "0";
}

で「$outdata」に突っ込んでいます。
「$outdata」が空なら最上位桁なので元の文字を入れて、
それ以外なら「0」を入れていますよ。
$outdataの中身は

""
 ↓
"4"
 ↓
"40"
 ↓
"400"

のように変わっていきます。
結果として、456が400になる理屈です。

ちなみに、三項演算子の使用に抵抗がないなら

$outdata = "";
foreach(str_split($indata) as $value){
    $outdata .= ($outdata == "" ? $value : 0);
}

とか書いてもOKです。
三項演算子に慣れていないと処理の内容が分かりにくいですが、
見た目は、こっちの方がスッキリしていますね。

これが「1文字ずつに分割して最初以外を0に置き換えて再結合する」です。

次に「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」をやってみます。

……(--)

できた!φ(--)

$outdata = floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);

せ、説明しておきましょうか(^^;

strlen($indata)

で元の数字の桁数を取得しています。
元の数字が456なら「3」が取得できます。

pow(10, strlen($indata) -1))

は……なんて説明しましょうね?
元の数字が456なら10の3-1乗で100です。

・2→1
・23→10
・456→100
・7890→1000

のような値が取得できます。
元の数字を割って1桁にするための値です。

$indata / pow(10, strlen($indata) -1)

は、元の数字を割って最上位桁が1の位になるようにしています。
456÷100で4.56です。

floor($indata / pow(10, strlen($indata) -1))

は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てています。
floor()は切り捨ての関数です。
456÷100で4.56になり、小数点以下が切り捨てられて4になります。

いよいよ最後です。

floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);

は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てたものを
元の桁数に戻しています。
456÷100で4.56になり、小数点以下が切り捨てられて4になったものを100倍して400です。

結果として、456が400になりました。

1.最上位桁が1の位になるように割って
2.小数点以下を切り捨てて
3.元の桁数に戻す


の流れですね。
これをサクっと1行で書いたのが

$outdata = floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);

です。
もし見やすさを求めたいのであれば、例えば

$keta_num = strlen($indata);
$keta = pow(10, $keta_num -1);

$outdata = floor($indata / $keta) * $keta;

のように分けて書けばマシになると思います。
やっていることは同じですけどね。
少しは見やすいはずです。

これが「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」です。

……パッと見で、どっちが分かりやすいかは微妙だなぁ(--ゞ

取りあえず、そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事