PHP の array_search および in_array 関数の効率の問題

藏色散人
リリース: 2023-04-07 17:28:01
転載
3684 人が閲覧しました

問題

インターフェイスで、非常に時間がかかることが分かり、原因を調査したところ、array_searchで要素のキーを検索する際に、アレイの場合、アレイが大きくなるほど効率が向上し、時間がかかります。特に大規模な配列の場合、非常に時間がかかります。この問題は関数 in_array にも存在します。

解決策

array_flip を使用した後、in_array 関数の代わりに isset を使用し、array_search の代わりに $array[key] を使用すると、時間のかかる問題を解決できます。大きな配列

以下は php 公式 Web サイトからコピーしたメモです。2 つの方法の効率の違いがわかります。

元の Web サイト: https://www.php.net /manual/en/function.in-array.php

If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...
ログイン後にコピー
$needle = 'test for this';
$flipped_haystack = array_flip($haystack);
if ( isset($flipped_haystack[$needle]) )
{
  print "Yes it's there!";
}
ログイン後にコピー
I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times).
Remember to only flip it once at the beginning of your code though!
ログイン後にコピー

訂正

誰かが、array_flip が in_array や array_search よりも効率的であるとコメントしました。実験、それは本当です。これは当初考えていなかったことです。この解決策は、in_array 関数と array_search 関数が複数回使用される場合にのみ有効です。以下は私自身の実験結果です。問題を指摘してくれた @puppet に感謝します

<?php
$array = array();
for ($i=0; $i<200000; $i++){
    ##随机字符串
    $array[$i] = get_rand().$i;
}
$str = $array[150000];
$time1 = microtime(true);
array_search($str, $array);
$time2 = microtime(true);
echo &#39;原始方法:&#39;.($time2-$time1)."\n";
$time3 =  microtime(true);
$new_array = array_flip($array);
isset($new_array[$str]);
$time4 = microtime(true);
echo &#39;新方法:&#39;.($time4-$time3);
ログイン後にコピー

結果:

原始方法:0.0010008811950684
新方法:0.0069980621337891
ログイン後にコピー

ループ 5000 回

$array = array();
for ($i=0; $i<200000; $i++){
    ##随机字符串
    $array[$i] = get_rand().$i;
}
$str = $array[199999];
$time1 = microtime(true);
for ($i=0; $i<5000; $i++){
    array_search($str, $array);
}
$time2 = microtime(true);
echo &#39;原始方法:&#39;.($time2-$time1)."\n";
$time3 =  microtime(true);
$new_array = array_flip($array);
for ($i=0; $i<5000; $i++){
    isset($new_array[$str]);
}
$time4 = microtime(true);
echo &#39;新方法:&#39;.($time4-$time3);
ログイン後にコピー

結果:

原始方法:2.9000020027161
新方法:0.008030891418457
ログイン後にコピー

以上がPHP の array_search および in_array 関数の効率の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート