What, and how much, is faster - manually iterating over an array with foreach
and checking for needle
occurrence with in_array()
, or using array_intersect()
?
Asked
Active
Viewed 3,212 times
9

The Onin
- 5,068
- 2
- 38
- 55
-
1this answer might helpful for you : http://stackoverflow.com/questions/6329211/php-array-intersect-efficiency – Mahdi Rashidi Oct 31 '16 at 04:27
1 Answers
11
Benchmark
Test Script
<?php
$numbers = range(32, 127);
$numbersLetters = array_map('chr', $numbers);
for (;;) {
$numbersLetters = array_merge($numbersLetters, $numbersLetters);
if (count($numbersLetters) > 10000) {
break;
}
}
$numbers = range(1, count($numbersLetters));
printf("Sample size: %d elements in 2 arrays (%d total) \n", count($numbers), count($numbers) + count($numbersLetters));
printf("Benchmarking speed in foreach + in_array() scenario... (this might take a while) ");
shuffle($numbers);
shuffle($numbersLetters);
$t1 = microtime(true);
foreach ($numbers as $number) {
if (in_array($number, $numbersLetters)) {}
}
$t2 = microtime(true);
printf("DONE!\n");
printf("Time elapsed: %.5f \n", $t2 - $t1);
// =============================------------===============================
printf("Benchmarking speed with array_intersect...");
shuffle($numbers);
shuffle($numbersLetters);
$t1 = microtime(true);
array_intersect($numbers, $numbersLetters);
$t2 = microtime(true);
printf("DONE!\n");
printf("Time elapsed: %.5f \n", $t2 - $t1);
Output
Sample size: 12288 elements in 2 arrays (24576 total)
Benchmarking speed in foreach + in_array() scenario... (this might take a while) DONE!
Time elapsed: 3.79213
Benchmarking speed with array_intersect...DONE!
Time elapsed: 0.05765
Fiddle: http://ideone.com/OZ2Idf
Conclusion
array_intersect
is much faster than foreach
+ in_array
.
Why is array_intersect
faster?
- The intersection is computed in C code, as opposed to PHP
- Internally, Zend engine sorts the array prior to computing the intersection (why is processing a sorted array faster?)
-
2Update including https://codedmemes.com/lib/best-performance-array-intersection/ would be nice here – Rafał Łyczkowski Aug 28 '17 at 20:32
-
1Fast forward to PHP 8.2 and the difference is a small order of magnitude greater still. `foreach + in_array()`: 5.11544, `array_intersect`: 0.01294. – Markus AO Dec 23 '22 at 10:55