これらの2つの例を検討してください...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
これらのどちらが良いかを知りたいです。私はいつも最初のものを使用しましたが、多くの人々がこのサイトで2番目の例を使用するのを見ました。
それで、どちらが良いですか?もっと早く?より明確な意図?
isset()
は高速ですが、array_key_exists()
とは異なります。
array_key_exists()
は、値がNULL
であっても、キーが存在するかどうかを純粋にチェックします。
一方、isset()
は、キーが存在し、値がfalse
の場合、NULL
を返します。
最近行ったいくつかのテストに興味がある場合:
https://stackoverflow.com/a/21759158/520857
概要:
| Method Name | Run time | Difference
=========================================================================================
| NonExistant::noCheckingTest() | 0.86004090309143 | +18491.315775911%
| NonExistant::emptyTest() | 0.0046701431274414 | +0.95346080503016%
| NonExistant::isnullTest() | 0.88424181938171 | +19014.461681183%
| NonExistant::issetTest() | 0.0046260356903076 | Fastest
| NonExistant::arrayKeyExistsTest() | 1.9001779556274 | +209.73055713%
主な違いは、isset()
が返すのに対し、array_key_exists()
はnull値に対応する配列キーに対してtrue
を返さないことです。
小さなベンチマーク を実行すると、isset()
のほうが高速ですが、完全に正確ではない場合があります。
途中で抜けていなかったので、この質問に2セントを追加したかったのです。
既に述べたように、isset()
はキーの値を評価するため、その値がfalse
の場合はnull
を返します。ここで、array_key_exists()
はキーは配列に存在します。
PHP 7を使用して簡単なベンチマークを実行しました。示されている結果は、反復を完了するのにかかった時間です。
_$a = [null, true];
isset($a[0]) # 0.3258841 - false
isset($a[1]) # 0.28261614 - true
isset($a[2]) # 0.26198816 - false
array_key_exists(0, $a) # 0.46202087 - true
array_key_exists(1, $a) # 0.43063688 - true
array_key_exists(2, $a) # 0.37593913 - false
isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false
array_key_isset(0, $a) # 1.17933798 - true
array_key_isset(1, $a) # 0.70253706 - true
array_key_isset(2, $a) # 1.01110005 - false
_
完了のために、このカスタム関数からの結果もこのベンチマークに追加しました。
_function array_key_isset($k, $a){
return isset($a[$k]) || array_key_exists($k, $a);
}
_
すでに説明したように、isset()
は最速のメソッドですが、値がnull
の場合はfalseを返す可能性があります。これは、望ましくない結果をもたらす可能性があり、通常は、array_key_exists()
を使用する必要があります。
ただし、中間の方法があり、isset() || array_key_exists()
を使用しています。このコードは通常、より高速な関数isset()
とifisset()
がfalseを返しますのみ検証にarray_key_exists()
を使用します。上の表に示すように、isset()
を単純に呼び出すのと同じくらい高速です。
はい、書くのはもう少し多く、関数でラップするのは遅くなりますが、ずっと簡単です。パフォーマンスのためにこれが必要な場合、ビッグデータをチェックするなどして完全に書き出します。それ以外の場合、関数array_key_isset()
の1回限りのオーバーヘッドはごくわずかです。
php.net とは違います:
isset()は、NULL値に対応する配列キーに対してTRUEを返しませんが、array_key_exists()は返します。
非常に非公式のテストでは、array_key_exists()
がisset()
の約2.5倍遅いことが示されています
isset()
とis_null()
を組み合わせると、array_key_exists()
、isset()
、isset()
+ array_key_exists()
のような他の機能に対して最高のパフォーマンスが得られます。 、is_null()
、isset()
+ is_null()
、ここでの唯一の問題は、キーが存在しない場合に関数がfalseを返すだけでなく、キーが存在し、ヌル値。
ベンチマークスクリプト:
<?php
$a = array('a' => 4, 'e' => null)
$s = microtime(true);
for($i=0; $i<=100000; $i++) {
$t = (isset($a['a'])) && (is_null($a['a'])); //true
$t = (isset($a['f'])) && (is_null($a['f'])); //false
$t = (isset($a['e'])) && (is_null($a['e']));; //false
}
$e = microtime(true);
echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
?>
クレジット: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements- exist-in-an-an-array /
「より速く」:試してみてください(私のお金はarray_key_exists()
にありますが、今は試せません)。
「意図の明確化」に関して:array_key_exists()
Php 7では、 Null Coalescing Operator を使用する可能性があります。
Nullの合体演算子(??)は、isset()と組み合わせて3項を使用する必要がある一般的な場合の構文糖として追加されました。存在し、NULLでない場合、最初のオペランドを返します。それ以外の場合は、2番目のオペランドを返します。
そのため、値がnullの場合、またはキーが存在しない場合にデフォルト値を割り当てることができます。
$var = $array[$key] ?? 'default value'
明らかに、2番目の例は意図がより明確であり、それについて疑問の余地はありません。例1が何をするのかを理解するには、PHPの変数初期化の特異性に精通する必要があります。そして、null値などに対して機能が異なることがわかります。
どちらが速いか-私は推測するつもりはありません-あなたのPHPバージョンとあなたが見つけるでしょう:)で数十万回のタイトなループで実行してください