-
-
function array_diff($array_1, $array_2) { - $diff = array();< ;/p>
foreach ($array_1 as $k => $v1) {
- $flag = false;
- foreach ($array_2 as $v2) {
- if ( $flag = ($v1 == $v2)) {
- break;
- }
- }
if (!$flag) {
- $diff [$k] = $v1;
- }
- }
return $diff;
- }
- ?>
-
-
코드 복사
위 코드의 구현은 다소 무리가 있습니다.
그래서 나는 그것을 다시 생각하고 알고리즘을 최적화했습니다. 두 번째 함수는 다음과 같습니다.
-
-
function array_diff($array_1, $array_2) { - foreach($array_1 as $key => $item) {
- if (in_array($item, $array_2, true)) {
- unset($array_1[$key]);
- }
- } p>
return $array_1;
- }
- ?>
-
-
코드 복사
이번에는 원래 array_diff 함수만큼 빠릅니다.
하지만 더 최적화된 방법이 있을까요?
PHP는 다음과 같이 작성할 수 있다는 것을 알았습니다.
-
-
function array_diff($array_1, $array_2) { - $array_2 = array_flip( $array_2);
- foreach ($array_1 as $key => $item) {
- if (isset($array_2[$item])) {
- unset($array_1[$key]);
- }
- }
return $array_1;
- }
- ?>
-
-
코드 복사
이 함수의 효율성은 놀랍습니다. 원래 array_diff 함수보다 훨씬 빠릅니다. 이유를 조사한 결과 다음과 같은 설명을 찾았습니다.
키가 HASH로 정리되어 있어서 검색이 매우 빠릅니다.
값은 Key로만 구성되고 저장되며 인덱스 자체는 없으며 각 검색이 순회됩니다. 요약
이는 PHP 언어의 약간의 트릭이지만 배열 값을 순회하고 비교할 때 값을 비교해야 하는 경우 키를 사용하여 이를 반전하는 것이 실제로 일반적인 값 대 값 비교보다 훨씬 효율적입니다.
예를 들어 위의 함수 2는 in_array 함수를 호출해야 하며 함수 내에 있는지 확인하기 위해 반복해야 하며, 함수 3은 키가 배열에 존재하는지 여부만 확인합니다. 배열 키와 값의 다양한 조직적 인덱싱 방법과 결합하면 효율성이 상상 이상으로 높다는 것은 매우 이해할 수 있습니다.
전체 코드는 다음과 같습니다.
-
-
- function microtime_float() {
- list($usec, $sec) = 폭발 (" ", microtime());
- return ((float)$usec (float)$sec);
- }
function array_diff2($array_1, $array_2 ) {
- $diff = array();
foreach ($array_1 as $k => $v1) {
- $flag = false;
- foreach ($array_2를 $v2로) {
- if ($flag = ($v1 == $v2)) {
- break;
- }
- }
- $diff[$k] = $v1;
- }
- }
return $diff;
- }< ;/p>
- function array_diff3($array_1, $array_2) {
- foreach ($array_1 as $key => $item) {
- if (in_array($item) , $array_2, true)) {
- unset($array_1[$key]);
- }
- }
return $array_1;
- }< ;/p>
- function array_diff4($array_1, $array_2) {
- $array_2 = array_flip($array_2);
- foreach ($array_1 as $key => $ item) {
- if (isset($array_2[$item])) {
- unset($array_1[$key]);
- }
- }
- < p>return $array_1;
- }
//////////////////////////// / //
for($i = 0, $ary_1 = array(); $i < 5000; $i ) {
- $ary_1[] = rand(100 , 999);
- }
for($i = 0, $ary_2 = array(); $i < 5000; $i ) {
- $ary_2[ ] = rand(100, 999);
- }
header("콘텐츠 유형: text/plain;charset=utf-8");
$time_start = microtime_float();
- array_diff($ary_1, $ary_2);
- echo "array_diff 함수가 실행됩니다." (microtime_float() - $time_start) " 초 n";< ; /p>
$time_start = microtime_float();
- array_diff2($ary_1, $ary_2);
- echo "array_diff2 함수가 실행됩니다." (microtime_float() - $time_start) " 초 n";
$time_start = microtime_float();
- array_diff3($ary_1, $ary_2);
- echo "array_diff3 함수가 실행됩니다." . (microtime_float() - $ time_start) . " 초 n";
$time_start = microtime_float();
- array_diff4($ary_1, $ary_2);
- echo "array_diff4 함수가 실행됩니다." ( microtime_float() - $time_start) . " 초 n";
- ?>
-
코드 복사
|