Есть 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
Но как сравнить?
1. LShark - 27 Января, 2013 - 16:46:27 - перейти к сообщению
2. LShark - 27 Января, 2013 - 20:52:57 - перейти к сообщению
Неужели нет более скоростных алгоритмов? Хм... не верю.
3. EuGen - 27 Января, 2013 - 21:17:56 - перейти к сообщению
У Вас сравнение по совпадению первой части - или по индексу массива? Если второе, то достаточно быстро отработает конструкция наподобие
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- 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'
- );
- но вот если имеется ввиду требование поискать строки, начинающиеся на значения, указанные во втором массиве, то здесь уже нужно смотреть по ситуации. Если поиск повторяется многократно при относительно редкой смене данных, то логично привести данные в соответствие виду, когда можно сравнивать на прямое равенство и затем снова использовать array_intersect (или же array_intersect_key)
Если же данные меняются часто, то такое преобразование может и не дать желаемого прироста - тут все зависит от числа итераций, которые происходят при загрузке. Возможно, некоторый прирост в быстродействии такое приготовление данных и даст, но улучшения сложности алгоритма, думаю, не произойдет.