Problem
인터페이스에서 원인을 조사한 결과 array_search에서 검색할 때 시간이 많이 걸리는 것으로 나타났습니다. 배열 요소의 키가 커지면 배열이 커질수록 효율성이 높아지며 시간 소모도 늘어납니다. 특히 대규모 배열의 경우 시간이 많이 걸립니다. 이 문제는 in_array 함수에도 존재합니다.
Solution
array_flip을 뒤집은 후 in_array 함수 대신 isset을 사용하고 array_search 대신 $array[key]를 사용하면 문제를 해결할 수 있습니다. 문제 배열 시간 초과 시간이 많이 걸리는 문제
다음은 PHP 공식 웹사이트에서 복사한 메모입니다. 두 가지 방법의 효율성 차이를 확인할 수 있습니다
원본 웹사이트: 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!
Correction
#🎜🎜 #누군가는 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
$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);
결과: #🎜 🎜 # 위 내용은 PHP array_search 및 in_array 함수 효율성 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!原始方法:2.9000020027161
新方法:0.008030891418457