Какая есть альтернатива нативному array_intersect в PHP?

Наверное, многие знают об этом.
Пишем простую функцию для нахождения пересечения двух массивов без ключей.

Что-то вроде этого
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 не могли предусмотреть такие частные случае массивов (без ключей и легко поддающиеся сортировке)?
  • Вопрос задан
  • 3580 просмотров
Пригласить эксперта
Ответы на вопрос 2
У Вас есть какое-то ограничение в функции, которое даёт выйгрыш. Это нормальное явление.

Я, например, использую свою самописную функцию json_encode с ограничением на мерность массивов. За счёт этого (исключается лишняя проверка is_array) моя самописная функция примерно в 3 раза быстрее нативной.
Ответ написан
У вас числовые массивы. Попробуйте с другими типами значений, к примеру, длинными строками.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы