ラベル 変数 の投稿を表示しています。 すべての投稿を表示
ラベル 変数 の投稿を表示しています。 すべての投稿を表示

2013年3月16日土曜日

最後の一文字

先日、PHPで文字列から最初の一文字を取る方法について記事を書きました。
今回は最後の一文字を取る方法について調査してみました。

方法1
$str = 'abcde';
substr($str, -1);
方法2
$str = 'abcde';
$str{strlen($str)-1};
サンプルコード 実行結果
BenchMark 1     average:0.0076918125152588
BenchMark 2     average:0.0067881345748901
あんまり差がつきませんでしたね。
速度を取るなら後者、文字数を取るなら前者でしょうか。

2013年3月15日金曜日

変数のswap

小ネタです。
PHPで変数の値を入れ替えたいときの定石ですね。

サンプルコード 実行結果
int(1)
int(2)
int(2)
int(1)
ただ、未だに変数の値を入れ替えたい状況というのに出会ったことがありませんw

2013年3月13日水曜日

変数と配列

今日も今日とて趣味のベンチマークです。
小さな積み重ねがいつか実ると信じています。

今回は変数と配列の扱いについてです。

サンプルコード 実行結果
BenchMark 1     average:0.0046348333358765
BenchMark 2     average:0.01211142539978
BenchMark 3     average:0.012383699417114
変数と比べて配列は3倍くらい遅いですね。
配列の利点の一つとして同じ属性の変数をまとめて分り易いコードを書ける点だと思います。

また、変数と配列の出力についても調査してみました。

サンプルコード 実行結果
BenchMark 1     average:0.2620055437088
BenchMark 2     average:0.26266303062439
BenchMark 3     average:0.26184134483337
こんな感じでした。
一概に変数と配列のどちらが優れているとは言えませんが、
使いどころについては考えたほうが良さそうです。

ローカル変数とメンバ変数

メンバ変数は一般に遅いと言われていますがどれくらい遅いのでしょうか?
実際に調査してみました。

サンプルコード 実行結果
BenchMark 1 average:0.11058385372162
BenchMark 2 average:0.11761968135834
BenchMark 3 average:0.11095626354218
ローカル変数よりメンバ変数が遅いのはともかくとして、比較するとstaticの方が速いですね。
当然といえば当然の結果ですが。

気になったのであと数パターン試してみました。

サンプルコード 実行結果
BenchMark 1     average:0.58168365955353
BenchMark 2     average:0.56918079853058
サンプルコード 実行結果
BenchMark 1     average:0.58172357082367
BenchMark 2     average:0.58285653591156
今回はここまでです。

一文字だけ欲しい

PHPでスクリプトを書いていて変数の最初の一文字だけ欲しい事ってありませんか?
そのような場合にはどうすればよいでしょうか?

このような書き方をしている人も居るかと思います。
ですが、もう少しベターな案を見つけましたのでメモ。
こちらの方がスマートです。
ちなみに、お決まりのベンチマーク。

サンプルコード 実行結果
BenchMark 1     average:0.084321331977844
BenchMark 2     average:0.034408354759216
速度も問題ありませんね。

2013年3月12日火曜日

Validation その3

今回は数値についてです。これが厄介です。
普通、数値と言いますと自然数を想定してコーディングする方が多いかと思います。
ですが、プログラム上で表現できる数値には様々な種類があります。



  • 符号の有無(+-)
  • 基数の違い(2進数、8進数、10進数、16進数)
  • int型の範囲(32ビット符号付ですと-2147483648~2147483647)を超える数値
  • 浮動小数点
  • 指数表現

これらの値について、使用しても良いかどうかを考慮しつつコーディングをしていかなければなりません。
今回は数値の中でも最も頻繁に使われる形式、Integerについて考えていきましょう。

チェックの手順

1. 引数がint型かどうかを調べる
int型ならreturn

2. int型でなければ次の可能性が上げられる
2.1 float型
2.2 string型の数値文字列
2.3 数値とは全く関係のない値

3. int型にキャストする際に注意すべき点
3.1 int型を超えた値でないか
超えていたらNULLを返す
超えていなければint型にキャストした値を返す

4. 数値とは全く関係ない値の場合
NULLを返す

サンプルコード 実行結果
NULL : NULL
"" : NULL
"a" : NULL
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : int(0)
1e3 : int(1000)
1e-3 : int(0)
array("") : NULL
array("a") : NULL
array(array("a")) : NULL
TRUE : NULL
FALSE : NULL
object : NULL
fopen : NULL
成功です。以降、数値のチェックをする際はこの関数を使って入力チェックを行っていきます。

Validation その1

スクリプトを書いていて気を使うところは変数のバリデーションです。
今回はその中で、scalar値かどうかの判別について考えたいと思います。

まず、取得したい値と弾きたい値の仕様について考えます。
取得したい値
  • integer
  • float
  • string
  • boolean

弾きたい値
  • NULL
  • array
  • object
  • resouce

というわけで、実装した関数はこうなりました。

サンプルコード

実行結果
NULL : string(0) ""
"" : string(0) ""
"a" : string(1) "a"
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : float(0.1)
1e3 : float(1000)
1e-3 : float(0.001)
array("") : string(0) ""
array("a") : string(0) ""
array(array("a")) : string(0) ""
TRUE : bool(true)
FALSE : bool(false)
object : string(0) ""
fopen : string(0) ""

上記の通り、特に問題なさそうです。
スカラー値を取得したいときはこの関数を使用していきたいと思います。