PHPでTwitterのIDをインクリメントしたい

TwitterのIDをPHPで扱おうとすると、整数型をオーバーフローし、文字列型を使う必要があります。そんな状態でインクリメントするにはどうしたら良いのでしょうか?

64ビットの罠

ご存じのとおり、TwitterのIDはすでに32ビットには収まらなくなっています。


そのため、32ビットを超えた数値を扱えない環境では文字列型のID「id_str」を使うことが推奨されています。
PHPも例外ではなく、整数型では扱える範囲に限りがあります。
(参照:PHP: 整数 - Manual
PHPがサポートする整数型の最大値は「PHP_INT_MAX」という定数で確認できます。32ビットシステムだと2147483647、64ビットシステムだと9223372036854775807になるはずです。
この最大値をオーバーフローすると、その値は浮動小数点数のfloat型として認識されます。
32ビットシステムではすでにIDがオーバーフローしているので、TwitterAPIのレスポンスに含まれる[id]はfloat型として認識されます。

            [id] => 4.5126780292238E+17
            [id_str] => 451267802922377216

E+が入っていて、人間にはよくわからない数値です。IDを取り扱うだけなら、文字列型の「id_str」を使えば問題ないのですが、IDをインクリメントして利用したい場合は少し厄介です。型キャストなどを使って頑張ってみても、結果が浮動小数点数になるなどして解決にはなりません。そこで使うのがBC Math 関数です。
(参照:PHP: BC Math 関数 - Manual
BC Math関数は任意精度演算に関して、文字列として表された任意の大きさおよび 精度の数をサポートするバイナリ計算機を提供します。
と言われてもよくわからないですよね。まぁ、興味があれば深く調べてみてください...
今回はインクリメントをしたいので、「bcadd()」という関数を使います。
(参照:PHP: bcadd - Manual
オペランドというのは演算の対象となる値や変数のことです。
使い方はPHP マニュアルに書いてある通りです。

// $idは文字列型
$id = '451267802922377216';
echo bcadd($id, '1');


文字列型の「451267802922377217」が得られます。
BC Math関数でみなさんも快適なインクリメント生活をお過ごしください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>