1

次のコード スニペットを検討してください。

例 #1

$array = Array(1,2,3,4,5,6,7);
$array_test = Array(3,5,4,7,3,6,7,8,8,9,3);

foreach($array_test as $value) {
   if(in_array($value, $array)) {
       // do some magic here
   }
}

例 #2

$array = Array(1,2,3,4,5,6,7);
$array_test = Array(3,5,4,7,3,6,7,8,8,9,3);

$array_index = Array();
foreach($array as $value) {
    $array_index[ $value ] = true;
}

foreach($array_test as $value) {
   if(isset($array_index[ $value ])) {
       // do some magic here
   }
}

明らかに、両方のスニペットが同じ仕事をします。一部の配列サンプルでは、​​例 #1 が例 #2 より高速です。

私たち全員が両方の状況にあったと確信していますが、私の質問は次のとおりです。

  • 常に #2 を選択する必要がありますか?
  • いつ #1 を選択する必要がありますか? のサイズが$array * $array_test10 未満の場合 <100? <1000?
  • 特定の状況でどちらの方法が優れているかを判断する方法は?
  • temp table を使用する以外のトリックがあるかもしれません$array_index。私は他のプログラミング言語で同様の状況を覚えていません。

連想キーにも注意してください。

誰かがすでに非常によく似た質問をしました:

4

2 に答える 2

2

2 番目の例では、 を使用する前に の「反転」値を作成$arrayする必要がありますisset()。ところで、そのためにも使用できますarray_flip()

配列キーをすぐに (変換せずに) 使用できる場合は、キーを検索する方法言語構成体であるため、isset()明らかにはるかに高速であるため、使用してください。in_array()

変換せずにキーを使用できない場合は、in_array()小さな配列に使用することを検討できます。より大きな配列の場合、ベンチマークを実行して、配列変換ステップがまだ価値があるかどうかを判断する価値がある場合があります。

最後に、主に状況に応じて、array_intersect_関数の 1 つを使用することもできます。これは主に、PHP コード内でループする必要がないようにするためです。

于 2013-01-23T03:01:14.360 に答える