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 :: Мне не лень, но нигде не нашел как..
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009
Помог: 0 раз(а)
Полностью код писать - тоже не нужно. Нужна наводка - куда рыть..
Если быть совсем точным, то ситуация такова:
Есть два массива. У обоих все значения строковые.
Первый - все значения заранее заданы (около 50 значений) и если и есть изменения, то крайне редко и только в сторону увеличения количества этих значений. Можно считать, что вообще не меняется.
А вот во втором - наоборот, все значения непостоянны.. И сами значения каждый раз разные и их количество тоже разное. Количество значений в среднем около 800, но может достигать 20 000, а редких случаях превышать 50 000..
И вот необходимо каждую строку этого второго массива сравнить на вхождение с любым значением первого массива (не первым попавшимся, а именно с любым).
Загвоздка в неидентичности значений.
#############################
Приведу близкий пример:
$a = array ("умный","глупый"); # первый массив (который неизменен)
$b = array ("Вася умный","Вася глупый как пень","Вася тупой","Вася гениальный"); # второй массив (который каждый раз разный)
#############################
Положительным результатом должны быть два первых значения массива b, тк именно в них есть вхождение значений массива a.
Можно конечно цикл в цикле сделать, но как то.. не изящно и непродуктивно..
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Тут явно логика приложения не продумана, я бы на твоем месте оставил в сторону эту задачу (точнее эту реализацию задачи) и подумал бы, как лучше спроектировать весь модуль заново. То, что ты пытаешься сделать, если не сейчас - так потом принесёт тебе кучу проблем.
Champion
Отправлено: 31 Марта, 2009 - 09:43:13
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Нет, цакл в цикле не нужно. Можно сделать цикл по всем элементам большого массива (там где "Вася гениальный"). Каждый элемент разбить на слова (функция explode). И каждое это слово проверить функцией in_array. Можно не каждое, а до первого совпадения. Думаю, так быстрее будет.
Поиска значения в массиве по частичному совпадению, на сколько я знаю, нету... Могу конечно ошибаться. (Добавление)
Над предложением Stierusа тоже подумай.
loisop
Отправлено: 31 Марта, 2009 - 10:24:34
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009
Помог: 0 раз(а)
Champion пишет:
разбить на слова (функция explode)
не совсем..
В первом массиве реальны строковые значения из нескольких слов.. еще точнее - большинство именно 2-3 слова...
Champion пишет:
Поиска значения в массиве по частичному совпадению,
я тоже нашел только для идентичных..
Stierus пишет:
подумал бы, как лучше спроектировать весь модуль заново.
да я б только за.. никак на соображу..
################
Попробую еще раз, сначала..
Я парсю хтмл (каждый раз - разный... размер заранее неизвестен) прег_матч_алл'ом. Выдергиваю конкретные куски, заключенные между конкретных тегов. Кажный кусочек пишется в массив. А вот ТОЛЬКО ТЕ ячейки массива, в которых есть подстрока из любой ячейки первого (малого, жестко заданного) массива мне и нужны.. На их основе я формирую хтмл-ку вывода..
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Я бы на твоем месте использовал preg_replace_callback или, если первый массив, действительно, мелкий и не меняется, формировал бы сразу регулярное выражение, учитывающее этот массив (надо тестировать, что вышло бы шустрее)
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
loisop пишет:
Я парсю хтмл (каждый раз - разный... размер заранее неизвестен) прег_матч_алл'ом. Выдергиваю конкретные куски, заключенные между конкретных тегов. Кажный кусочек пишется в массив.
Вооот. Видишь, где на самом деле проблема?
Я думаю, есть возможность сразу проверять куски, заключенные между конкретными тегами на соответсвие элементам массива? Функции strstr, strpos к вашим услугам.
loisop
Отправлено: 31 Марта, 2009 - 20:01:00
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009
Помог: 0 раз(а)
Champion пишет:
возможность сразу проверять куски
может быть и есть, но я такую не знаю.. функция preg_match_all кидает кусочки СРАЗУ в массив..
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
loisop пишет:
может быть и есть, но я такую не знаю
Она есть. Я не в этом смысле. Я имел в виду, есть ли возможность подпроавить, чтоб это реализовать? Или этого делать нельзя?
preg_match_all кидает куски сразу в массив - да. После каждой проверки тебе preg_match (preg_match_all не нужен, если куски по одному проверяешь) возвращает массив, как я представляю, из 2 элементов - соответствие шаблону целиком(нулевой) и соответствие тому, что в скобках (в скобках ты укажешь ту часть, которая соответствует тексту.
'/\<tag\>(.+)\<tag\>/')(первый). Вот в первом элементе массива ты проверяешь выше написанными фунциями наличие того, что тебе надо из первого массива
AlexGreF
Отправлено: 01 Апреля, 2009 - 10:23:13
Новичок
Покинул форум
Сообщений всего: 44
Дата рег-ции: Март 2009 Откуда: Амурка
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Повторюсь ещё раз и забью на тему:
Есть 2 оптимальных случая:
1. при парсинге html-странички в регулярных выражениях сразу учитывать тот первый массив заранее известных фраз (прям в регулярном выражении ищутся сразу соответствия, тоесть савмо выражение либо генерируется налету из массива исходного, либо ты его 1 раз пишешь ручками и меняешь при добавлении элементов в массив)
2. При парсинге оставить старое регулярное выражение, выдергивающее строку, но использовать не preg_match, а preg_replace_callback - тогда найденая строка вместо того, что бы попадать в массив и ждать некоей обработки, будет сразу поступать в функцию на обработку, где ты будешь в отпарсеной строке искать вхождения элементов массива. (Добавление)
а по поводу вхождения элементов массива в строке уже тут писал http://forum.php.su/topic.php?fo...1&topic=1936
loisop
Отправлено: 02 Апреля, 2009 - 19:10:26
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009
Помог: 0 раз(а)
К сожалению не мог раньше ответить.. Приношу свои извинения.
Огромное спасибо всем участвовавшим и сочувствовавшим.
Выручил последний пост - stripos оказался панацеей.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.