array_key_exists($ key、$ array)は、指定された$キーが$ arrayに存在するかどうかを確認するために使用されます。 $キーが存在する場合はtrueを返し、それ以外の場合はfalse 。
この関数の利点は、値がnullであろうとfalseであろうと、正しく判断できるかどうかにかかわらず、配列内のすべてのキーを考慮していることです。例えば:
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'a'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// true</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'b'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// true</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'c'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// false</span></span><span>
</span></span>頻繁にarray_key_existsをループで呼び出すと、特に大きな配列を扱う場合、パフォーマンスにマイナスの影響を与える可能性があります。理由は次のとおりです。
検索操作の時間の複雑さ: array_key_existsの検索操作の時間の複雑さはo(1)です。これは、各ルックアップでの効率が一定レベルであることを意味します。ただし、ループで複数の呼び出しを行うと、特にループの数が非常に大きい場合は、この一定の時間が蓄積される場合があります。
同じキーを繰り返しチェックします。ループ内の同じ配列で複数のキーの存在チェックを実行すると、PHPはこれらのチェックを繰り返し実行し、不要なコンピューティングリソースを無駄にします。
例えば:
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)) {
</span><span><span class="hljs-comment">// 特定のアクションを実行します</span></span><span>
}
}
</span></span>上記のコードでは、 array_key_existsはループが毎回呼び出され、この特定のシナリオでは、 $ keyが配列に存在する必要があるため、このチェックは冗長です。
上記のパフォーマンスの問題に応じて、いくつかの最適化ソリューションを以下に提案します。
配列のキーが存在することをすでに知っている場合は、もう一度確認する必要はありません。たとえば、 array_key_existsを呼び出すことなく、ループの$キーを使用するだけです。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 直接使用します $key,電話を避けてください array_key_exists</span></span><span>
</span><span><span class="hljs-comment">// 特定のアクションを実行します</span></span><span>
}
</span></span>ループ内の複数のキーの存在を確認する必要がある場合は、最初にループの外側の配列のすべてのキーを取得し、 IN_ARRAYまたはその他のメソッドを介して一度に確認できます。これにより、 array_key_existsへの複数の呼び出しが回避されます。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>); </span><span><span class="hljs-comment">// すべてのキーを取得します</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$keys</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span>) {
</span><span><span class="hljs-comment">// 直接操作できます $array[$key]</span></span><span>
}
</span></span>ISSET()は、通常使用される機能であり、通常、配列内の値がnullまたは未定義であるかどうかを確認するために使用されます。 keyが存在し、値がnullでないかどうかのみを気にする場合、 isset()を使用することはarray_key_existsよりも効率的になります。これは、array値が設定されているかどうかを直接チェックし、 array_key_existsがキーが存在するかどうかを確認し、 null値を考慮します。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>])) {
</span><span><span class="hljs-comment">// 特定のアクションを実行します</span></span><span>
}
}
</span></span>いくつかの特別なシナリオでは、配列が非常に大きい場合、パフォーマンスの問題はArray_key_existsの問題ではなく、データ構造自体の選択に関連する可能性があります。この場合、 splobjectStorageやその他のハッシュテーブルなど、パフォーマンスの面でパフォーマンスが向上する可能性のある他のデータ構造の使用を検討する場合があります。
array_key_existsは非常に実用的な機能ですが、ループで頻繁に呼び出すことはパフォーマンスに影響を与える可能性があります。繰り返しのチェックを回避し、事前にキーを抽出し、適切な機能( ISSETなど)を選択し、適切なデータ構造を使用して、PHPコードの実行効率を効果的に改善することができます。実際の開発では、特定のアプリケーションシナリオに基づいて最適なソリューションを選択して、大量のデータを処理する際にプログラムが効率的であることを確認することが重要です。