回答:
$i++
で正しくありません。しかし、それは遅くなるはずです!!
$i++
。どういう意味ですか?「でも遅いほうがいい!!」何を比較しますか?
(int)
and intval()
:の違いについて注意すべき点の1つは、ベース引数に関係なく、少なくともsとsであるintval()
変数を変換する必要がないものとして扱います(少なくともPHP 5.3.5以降)。PHP docページのコメントに記載されているように、この動作は最も明白ではありません。int
float
$test_int = 12;
$test_string = "12";
$test_float = 12.8;
echo (int) $test_int; // 12
echo (int) $test_string; // 12
echo (int) $test_float; // 12
echo intval($test_int, 8); // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8) // 12 <-- HUH?
The base parameter has no effect unless the var parameter is a string.
ので、おそらくのが追加されたものということ、そして、再びページは明らかに4日前に更新されました。
intval(12,8)
フォーマットなしの文字列に変換すると、基数8のように見えるという答えを与える期待数が間違っている。intval(12,16)
intを作成できないため、何を期待しc
ますか?
ネクロでごめんなさい、PHP7がこの質問に影響するかどうか/どのように影響するのかを見たかっただけです。
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
テスト:
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3279.1121006012 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "5379.3351650238 ms"
ご覧のとおり、キャストは間違いなくほぼ 100%高速です
しかし、違いがほんの数秒になる前に、ループ数を1億個に増やす必要がありました。これは、ほとんどの場合、実際にパフォーマンスを気にし始める時期です。
したがってintval
、キャスティングは現在起こっている言語の魔法のビットなので、関数の使用に固執します。場合であってもintval
バグがあるとしたら、舞台裏キャストの用途は鋳物で発見し、それが修正されることができなかったいくつかの理由(後方互換性?)のために、それらは少なくとも修正で可能性がありintval
、それの義務を実行します。
アップデート(PHP 7.1 +追加ケース):
$ php -v
PHP 7.1.0RC6 (cli) (built: Nov 9 2016 04:45:59) ( NTS )
$ php -a
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3583.9052200317 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3569.0960884094 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = '1' + 0; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "1641.7920589447 ms"
7.1に最適化されたように見えintval
、「1」+ 0がこのスピードコンテストの勝者になりました:) intval
とにかく使い続けます
+0
はvarです...ここでの暗黙のキャストが明示的なキャストよりも速いかどうかはわかりません。
+0
勝利...それは非常に汚いハックです
v5.5.34
私の結果だった9191.0059452057 ms
、23307.397127151 ms
と11483.719110489 ms
それぞれ。したがって、PHP 7より前のバージョンでは、キャストが最速です。
$a = '1' + 0;
、私はそのようにすることはほとんど考えていませんでした
少なくとも1つの違いがあると思います:intvalでは、2番目のパラメーターとして使用するベースを指定できます(デフォルトではベース10)。
var_dump((int)"0123", intval("0123"), intval("0123", 8));
あなたを取得します:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
、のように、ベースとして渡すことができる最大値はであることがわかりましたintval("g", 36) //16
。36より大きい値は0を返します。これは、カスタムベースに0〜9とa〜zのすべての文字を使用できることを示唆していintval("z",36) //35
ます。また、最初のパラメータは大文字と小文字を区別しないことに注意してください。
の便利なプロパティの1つintval
は、これは関数であり、言語構造ではないため、関数を必要とする関数に引数として渡すことができることです。でこれを行うことはできません(int)
。
たとえば、整数をにIN()
渡してSQL 句に含めるために整数を無害化するために使用しましたarray_map
。次に例を示します。
$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
アンバーは正しいですし、有用な情報型のキャストを追加する場合(式の前に "(int)"を追加する)は、intvalより300〜600%高速です。したがって、10進数以外の基数を処理することが目的でない場合は、次の使用をお勧めします。
(int) $something