두 개의 배열이 있습니다. 배열 A에는 제거하려는 일부 요소가있는 긴 목록이 들어 있습니다. 배열 B는 배열 A에서 제거하려는 요소의 전체 목록입니다.한 배열의 모든 요소를 다른 배열에서 제거하는 가장 효율적인 방법은 무엇입니까?
이것을 달성하는 가장 효율적인 방법은 무엇입니까?
두 개의 배열이 있습니다. 배열 A에는 제거하려는 일부 요소가있는 긴 목록이 들어 있습니다. 배열 B는 배열 A에서 제거하려는 요소의 전체 목록입니다.한 배열의 모든 요소를 다른 배열에서 제거하는 가장 효율적인 방법은 무엇입니까?
이것을 달성하는 가장 효율적인 방법은 무엇입니까?
array_diff은 명백한 대답하지만, 당신이 가장 효율적인 방법을 요구 했으므로, 여기에 내 컴퓨터에
$big = range(1, 90000);
$remove = range(500, 600);
$ts = microtime(true);
$result = array_diff($big, $remove);
printf("%.2f\n", microtime(true) - $ts);
$ts = microtime(true);
$map = array_flip($remove);
$result = array();
foreach($big as $e)
if(!isset($map[$e]))
$result[] = $e;
printf("%.2f\n", microtime(true) - $ts);
인쇄 테스트를의
0.67
0.03
그래서 간단한 루프 해시 기반 검색은 array_diff보다 약 20 배 빠릅니다.
사용 array_diff()이 array_dif()이 exaple주는 manual에서
:
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
?>
출력 :
Array
(
[1] => blue
)
이하는 array1의 모든 항목을 포함한 배열을 돌려줍니다 아니 중 하나에 선물 다른 배열.
젠장, 잘됐다! :) +1 – Trufa
나는 메모리 사용이나 array_diff가 더 나은 작업을 수행하는 몇 가지 방법 때문에이 대답에 반대하고 싶다. 그러나 나는 정확한 것을 생각할 수 없다. 명성은 이제 PHP devs에게 array_diff를 더 빠르게 만들라고 말합니다. – Sparr