

例えば12345という数字があったとき、これを  
123、234、345という風に分けるのを数字のまますることはできますか。Pythonでstringにしてスライスをするとかは思い付いたのですが、数字のままそういうことをしたいです。


CC BY-SA 3.0
2017-03-12T00:27:51.640
33267
2017-03-13T05:40:37.777
2017-03-13T05:40:37.777
20276
question
php
PHPで型変換せず数値の一部を取得する


PHPに限らない話ですが、整数値の下n桁を求めたい場合には剰余演算が使えます。

[code]

    $num = 12345;
    $a = $num % 1000;
    echo $a."\n"; //-> 345
    
[/code]

下n桁ではなく、途中のn桁分を取りたいのであれば、取りたい桁が下n桁になるように割り算してから同じことをやってやれば良い訳です。

[code]

    $b = intdiv($num,10) % 1000;
    echo $b."\n"; //->234
    $c = intdiv($num,100) % 1000;
    echo $c."\n"; //->123
    
[/code]

(PHPの`%`演算子の動作からは`intdiv($num,10)`とかでなく、普通に`($num/10)`とかにしても動きそうなんですが、念のため`intdiv`を使っておきました。`intdiv`が存在しないバージョンの場合、`(int)($num/10)`等に置き換えるか、自分で`intdiv`を定義してください。)

特定の桁数ではなく一般的にと言うとちょっと面倒になりますが、`10`,`100`,`1000`とかの代わりに`pow(10,$n)`とかを使えば良いでしょう。

[code]

    $m = 2;  //->下位から数えて`$m`桁目から
    $n = 3;  //->`$n`桁分を取得する
    $d = intdiv($num,pow(10,$m)) % pow(10,$n);
    echo $d."\n";  //-> 123
    
[/code]

式だけパッと見せられて何をやっているのかがすぐにわかると言うものではないので、実用的にはPythonの例として見つけられたような文字列を介するやり方の方が良いかもしれません。


CC BY-SA 3.0
2017-03-12T01:32:33.190
33268
2017-03-12T01:32:33.190
13972
33267
answer


以下は正規表現の肯定的先読み(positive look ahead)を使う方法です。

[code]

    $x = 12345;
    preg_match_all("/(?=(.{3}))/", "$x", $m);
    var_dump(array_map(function($x){return (int)$x;}, $m[1]))
    =>                  
    array(3) {
      [0]=> int(123)
      [1]=> int(234)
      [2]=> int(345)
    }
    
[/code]

ただ、10進数値に変換しますので、文字列の先頭が "0" の場合は以下の様になります。

[code]

    $x = 12045;
    =>
    // "045"(部分文字列) が 45(整数値)に変換される
    array(3) {
      [0]=> int(120)
      [1]=> int(204)
      [2]=> int(45)
    }
    
[/code]


CC BY-SA 3.0
2017-03-12T03:46:43.990
33270
2017-03-12T03:51:53.370
2017-03-12T03:51:53.370
33267
answer