web-dev-qa-db-ja.com

PHPに配列キーが存在するかどうかを判断するのに、より速くて良いものは何ですか?

これらの2つの例を検討してください...

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

これらのどちらが良いかを知りたいです。私はいつも最初のものを使用しましたが、多くの人々がこのサイトで2番目の例を使用するのを見ました。

それで、どちらが良いですか?もっと早く?より明確な意図?

143
alex

isset()は高速ですが、array_key_exists()とは異なります。

array_key_exists()は、値がNULLであっても、キーが存在するかどうかを純粋にチェックします。

一方、isset()は、キーが存在し、値がfalseの場合、NULLを返します。

209

最近行ったいくつかのテストに興味がある場合:

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%
28
Populus

主な違いは、isset()が返すのに対し、array_key_exists()はnull値に対応する配列キーに対してtrueを返さないことです。

小さなベンチマーク を実行すると、isset()のほうが高速ですが、完全に正確ではない場合があります。

19
CMS

途中で抜けていなかったので、この質問に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回限りのオーバーヘッドはごくわずかです。

10
Xorifelse

php.net とは違います:

isset()は、NULL値に対応する配列キーに対してTRUEを返しませんが、array_key_exists()は返します。

非常に非公式のテストでは、array_key_exists()isset()の約2.5倍遅いことが示されています

6
Scott Evernden

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 /

2
H Aßdøµ

「より速く」:試してみてください(私のお金はarray_key_exists()にありますが、今は試せません)。

「意図の明確化」に関して:array_key_exists()

1
Tomalak

Php 7では、 Null Coalescing Operator を使用する可能性があります。

Nullの合体演算子(??)は、isset()と組み合わせて3項を使用する必要がある一般的な場合の構文糖として追加されました。存在し、NULLでない場合、最初のオペランドを返します。それ以外の場合は、2番目のオペランドを返します。

そのため、値がnullの場合、またはキーが存在しない場合にデフォルト値を割り当てることができます。

$var = $array[$key] ?? 'default value'
1
John

明らかに、2番目の例は意図がより明確であり、それについて疑問の余地はありません。例1が何をするのかを理解するには、PHPの変数初期化の特異性に精通する必要があります。そして、null値などに対して機能が異なることがわかります。

どちらが速いか-私は推測するつもりはありません-あなたのPHPバージョンとあなたが見つけるでしょう:)で数十万回のタイトなループで実行してください

0