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
----------------------------------------