Оптимизация перебора строкового массива

ropman

Новичок
Оптимизация перебора строкового массива

Как можно значительно увеличить скорость следующего перебора массива
(нужно выбрать из строк массива только те, которые входят в строку $str):
PHP:
$arr - массив строковых данных (до 100000 эл.)
$str="long string etc";
$size=sizeof($arr);
$o="";
for ($i=0;$i<=$size;$i++)
 {
 if (strpos ($str,$arr[$i])!==false) $o.=$arr[$i]." ";
 }
Может есть варианты с хешированием строк или какие-то другие варианты.
Использовать sql БД нет возможности, только работа с массивом.
 

RigVan

Постоянный член клуба
ropman
Может это поможет...
PHP:
$newarray= array_intersect($arr, $str);
print_r($newarray);
естественно $str должна быть тоже массивом, хотябы и из одного элемента...
 

RigVan

Постоянный член клуба
Sam

и кому это поможет?
А в чем собственно проблема? array_intersect , как раз и ищет пересечения массивов, и возвращает новый массив из этих пересечений...
 

RigVan

Постоянный член клуба
Sam
а человеку нажно совсем другое
"нужно выбрать из строк массива только те, которые входят в строку $str" - это другое?

-~{}~ 26.03.06 23:37:

Вообще пусть человек сам ответит :)
ropman проблема решена?
 

RigVan

Постоянный член клуба
Sam
Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.
Не думаю, что эта оговорка помешает автору, но в то же время, похоже, что самому автору это уже не интересно... :)
 

ropman

Новичок
array_intersect не подойдет, потому что нужно именно strpos, строки могут быть не совсем одинаковыми.

Попробовал array_walk, результат получился значительно медленнее чем с использованием for.
 

vadim

Guest
ropman
Если бы искомые строки начинались бы одинаково, то можно было бы сначало отсортировать, а потом быстро найти...Но это конечно частный случай

А загнать в базу сначало не получится??? Потом искать типа LIKE??

-~{}~ 27.03.06 01:50:

ropman
также можно попробывать array_uintersect() и ей передавать свою функцию сравнения, но for всё равно будет быстрей
 

garlian

Новичок
ropman, попробуй массив $arr(string,g);
a потом вывести $o. :)
Ты получишь нетолько string но и g...
 

ropman

Новичок
Без базы нужно, но даже если загнать в базу, там LIKE не получится, т.к. нужно искать входит ли каждая запись из БД в строку $str (проверять содержит ли в себе строка $str каждую строку из базы), а не наоборот.

garlian не понял, поясни на примере кода.
 

garlian

Новичок
Re: Оптимизация перебора строкового массива

Я показал, что твоим способом можно получить не тот результат, который хочеться. Допустим массив данных будет таким $arr = array(etc,g,aaa), но из него выбрать надо тоько то что написано в $str т.е. long или string или etc, но результат будет не только etc, но и g (а так же s,e,c если они указаны в массиве).
PHP:
$arr = array(etc,g,aaa);
$str="long string etc";
$size=sizeof($arr);
$o="";
for ($i=0;$i<=$size;$i++)
 {
 if (strpos ($str,$arr[$i])!==false) $o.=$arr[$i]." ";
 }
echo $o;
Конечно, это никак не будет влиять, если элемент массива будет больше чем один символ, я думаю у тебя так.
 

Фанат

oncle terrible
Команда форума
ropman
реально быстро можно сделать с помощью внешних утилит.
grep, к примеру.
 

bgm

&nbsp;
Или измени способ хранения данных или, если у тебя юнихо-подобная система - используй системные средства.

Update: упс, опередили.
 

ropman

Новичок
гуру unix, посоветуйте

Гуру Unix, посоветуйте как сделать такое такое с помощью grep или других системных утилит.
Или ссылку на хороший форум по юниксам, где ответят.
 
Сверху