ホームページ >バックエンド開発 >PHPチュートリアル >PHP の array_search および in_array 関数の効率の問題
問題
インターフェイスで、非常に時間がかかることが分かり、原因を調査したところ、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 '原始方法:'.($time2-$time1)."\n"; $time3 = microtime(true); $new_array = array_flip($array); isset($new_array[$str]); $time4 = microtime(true); echo '新方法:'.($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 '原始方法:'.($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 '新方法:'.($time4-$time3);
結果:
原始方法:2.9000020027161 新方法:0.008030891418457
以上がPHP の array_search および in_array 関数の効率の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。