PHP - какой самый быстрый способ поиска значения одного массива в другом?

Есть два одномерных массива. Каждый примерно по 1млн. ключей-значений.

$array1 = [
    'test_string1',
    'test_string2',
];

$array2 = [
    'test_string1_fromfile1',
    'test_string9993_2021_10',
];

Нужно проверить, что в $array2 есть элемент, который содержит подстроку из $array1? Мы должны по test_string1 из $array1 пройти по всему $array2 до первого совпадения значения (test_string1_fromfile1), потом можно сделать break и перейти к следующему значению из $array1. Можно через preg_grep(), но насколько я понимаю он выбирает все совпадающие значения, а нам не обязательно идти по всему массиву, если мы уже нашли совпадение. Задача сделать это максимально быстро на PHP.


Ответы (1 шт):

Автор решения: Roman Grinyov

Не претендую на правоту, но вот такой кейс (https://replit.com/@w3lifer/StableOrderlyLifecycle):

<?php

$array1 = ['99999', '100000'];

$array2 = range(0, 1e5);

echo "\n" . '----------------------------------------' . "\n\n";

foreach ($array1 as $item1) {
    $startTime = microtime(true);
    foreach ($array2 as $item2) {
        if (strpos($item2, $item1) !== false) {
            $endTime = microtime(true);
            echo
                'Item 1: ' . $item1 . "\n",
                'Item 2: ' . $item2 . "\n",
                'Time: ' . ($endTime - $startTime);
            echo "\n\n" . '----------------------------------------' . "\n\n";
            break;
        }
    }
}

$array2AsString = implode($array2);

foreach ($array1 as $item1) {
    $startTime = microtime(true);
    if (strpos($array2AsString, $item1) !== false) {
        $endTime = microtime(true);
        echo
            'Item 1: ' . $item1 . "\n",
            'Time: ' . ($endTime - $startTime);
        echo "\n\n" . '----------------------------------------' . "\n\n";
    }
}

Один из результатов:

----------------------------------------

Item 1: 99999
Item 2: 99999
Time: 0.10932898521423

----------------------------------------

Item 1: 100000
Item 2: 100000
Time: 0.13008189201355

----------------------------------------

Item 1: 99999
Time: 0.00080418586730957

----------------------------------------

Item 1: 100000
Time: 0.00097298622131348

----------------------------------------
→ Ссылка