Наверное, многие знают об этом.
Пишем простую функцию для нахождения пересечения двух массивов без ключей.
Что-то вроде этого
function array_intersect2($a, $b) {
$al = count($a);
$bl = count($b);
sort($a);
sort($b);
$max = ($a[$al - 1] > $b[$bl - 1]) ?
$a[$al - 1] :
$b[$bl - 1];
$min = ($a[0] < $b[0]) ?
$a[0] :
$b[0];
$c = array();
foreach($a as $i) {
if($i > $min && $i < $max) {
$c[] = $i;
}
}
foreach($b as $i) {
if($i > $min && $i < $max) {
$c[] = $i;
}
}
return $c;
}
Далее запускаем простой тест на пересечение двух массивов
К примеру таких:
$a = array();
$b = array();
for($i = 0; $i < 50000; $i++) {
$a[] = mt_rand(0, 100000);
$b[] = mt_rand(0, 100000);
}
в тесте сравниваем производительность array_intersect и array_intersect2
У меня стабильно собственная реализация всегда обгоняет нативную функцию по производительности. Учитывая что любой php-программист знает, что всегда лучше использовать нативные функции против реализаций на php, такая производительность кажется очень странной для array_intersect. Почему так происходит?
Неужели разработчики php не могли предусмотреть такие частные случае массивов (без ключей и легко поддающиеся сортировке)?