Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Выбор данных, совпадающих из двух массивов. Как ускорить?
Покинул форум
Сообщений всего: 240
Дата рег-ции: Нояб. 2012
Помог: 1 раз(а)
Есть 2 массива.
В одном - номера и названия - например:
0 => 00 Параметр1
1 => 01 Параметр2
2 => 02 Параметр3
3 => 04 Параметр5
4 => 03 Параметр4
5 => 05 Параметр6
6 => 07 Параметр8
7 => 06 Параметр7
Есть второй - в котором просто перечислены номера пунктов:
0 => 03
1 => 04
2 => 02
3 => 09
Как из первого быстрее выбрать названия "Параметр...", соответствующие значениям второго массива?
Простой способ - через foreach перебирать первый массив, проверяя, подходит ли очередное значение второго массива (т.е. найдет значения дял 03, 04, 02 и пропустит под 09, так как такого нет в первом массиве).
НО!
В первом массиве около 100 значений.
Во втором - может быть от 1 до 100.
Сколько же переборов придется сделать? Если 99 значений во втором, то будет выполнено до 9к сравнений (реально, конечно, меньше, так как если нашлось - далее не проверяем).
Но плохо еще то, что на странице таких блоков может быть до 40 (хотя Массив1 у всех один, но Массив2 в каждом случае свой с разным количеством значений).
Есть ли более простой способ выбрать из первого массива значения, совпадающие со вторым?
Можно, конечно, разбить первый массив на два параметра:
0 => [0] = 00, [1] = Параметр1
1 => [0] = 01, [1] = Параметр2
- но вот если имеется ввиду требование поискать строки, начинающиеся на значения, указанные во втором массиве, то здесь уже нужно смотреть по ситуации. Если поиск повторяется многократно при относительно редкой смене данных, то логично привести данные в соответствие виду, когда можно сравнивать на прямое равенство и затем снова использовать array_intersect (или же array_intersect_key)
Если же данные меняются часто, то такое преобразование может и не дать желаемого прироста - тут все зависит от числа итераций, которые происходят при загрузке. Возможно, некоторый прирост в быстродействии такое приготовление данных и даст, но улучшения сложности алгоритма, думаю, не произойдет.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
LShark
Отправлено: 27 Января, 2013 - 21:32:21
Частый гость
Покинул форум
Сообщений всего: 240
Дата рег-ции: Нояб. 2012
Сейчас буду экспериментировать, что жрет меньше ресурсов при максимально возможных вариантах (когда во втором массиве 99 пунктов для поиска из 100). (Добавление)
Понятно.
Получается, что вариант:
$c=array_intersect($spisok_b, $pokaz);
foreach($c as $key =>$value) {
$adnod[$dn1].= $spisok[$key]."<br>";
}
выполняется при первом запуске 0,00412 (в среднем) и 0,00327 при повторных запусках.
вариант, использующий сразу перебор через
array_search - 0,00616 при первом и 0,00412 при повторных проходах.
И это при 1 блоке в 99 вариантов.
Уже при 3-х блоках:
array_search при первом проходе занимает уже 0.01052 sec и 0,00754 при повторных, а приведенный вариант:
0,00669 при первом и 0,00458 при повторных.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.