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 :: Мне не лень, но нигде не нашел как..

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: вхождение в строку значения массива.
loisop
Отправлено: 31 Марта, 2009 - 07:41:57
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Полностью код писать - тоже не нужно. Нужна наводка - куда рыть..
Если быть совсем точным, то ситуация такова:
Есть два массива. У обоих все значения строковые.
Первый - все значения заранее заданы (около 50 значений) и если и есть изменения, то крайне редко и только в сторону увеличения количества этих значений. Можно считать, что вообще не меняется.
А вот во втором - наоборот, все значения непостоянны.. И сами значения каждый раз разные и их количество тоже разное. Количество значений в среднем около 800, но может достигать 20 000, а редких случаях превышать 50 000..
И вот необходимо каждую строку этого второго массива сравнить на вхождение с любым значением первого массива (не первым попавшимся, а именно с любым).
Загвоздка в неидентичности значений.
#############################
Приведу близкий пример:
$a = array ("умный","глупый"); # первый массив (который неизменен)
$b = array ("Вася умный","Вася глупый как пень","Вася тупой","Вася гениальный"); # второй массив (который каждый раз разный)
#############################
Положительным результатом должны быть два первых значения массива b, тк именно в них есть вхождение значений массива a.

Можно конечно цикл в цикле сделать, но как то.. не изящно и непродуктивно.. Недовольство, огорчение

(Отредактировано автором: 31 Марта, 2009 - 08:40:09)

 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 09:42:35
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Тут явно логика приложения не продумана, я бы на твоем месте оставил в сторону эту задачу (точнее эту реализацию задачи) и подумал бы, как лучше спроектировать весь модуль заново. То, что ты пытаешься сделать, если не сейчас - так потом принесёт тебе кучу проблем.
 
My status
 Top
Champion Супермодератор
Отправлено: 31 Марта, 2009 - 09:43:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Нет, цакл в цикле не нужно. Можно сделать цикл по всем элементам большого массива (там где "Вася гениальный"). Каждый элемент разбить на слова (функция explode). И каждое это слово проверить функцией in_array. Можно не каждое, а до первого совпадения. Думаю, так быстрее будет.

Поиска значения в массиве по частичному совпадению, на сколько я знаю, нету... Могу конечно ошибаться.
(Добавление)
Над предложением Stierusа тоже подумай.
 
 Top
loisop
Отправлено: 31 Марта, 2009 - 10:24:34
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
разбить на слова (функция explode)

не совсем..
В первом массиве реальны строковые значения из нескольких слов.. еще точнее - большинство именно 2-3 слова... Недовольство, огорчение
Champion пишет:
Поиска значения в массиве по частичному совпадению,

я тоже нашел только для идентичных..
Stierus пишет:
подумал бы, как лучше спроектировать весь модуль заново.

да я б только за.. никак на соображу..
################
Попробую еще раз, сначала..
Я парсю хтмл (каждый раз - разный... размер заранее неизвестен) прег_матч_алл'ом. Выдергиваю конкретные куски, заключенные между конкретных тегов. Кажный кусочек пишется в массив. А вот ТОЛЬКО ТЕ ячейки массива, в которых есть подстрока из любой ячейки первого (малого, жестко заданного) массива мне и нужны.. На их основе я формирую хтмл-ку вывода..

(Отредактировано автором: 31 Марта, 2009 - 10:25:07)

 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 10:30:38
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Я бы на твоем месте использовал preg_replace_callback или, если первый массив, действительно, мелкий и не меняется, формировал бы сразу регулярное выражение, учитывающее этот массив (надо тестировать, что вышло бы шустрее)

(Отредактировано автором: 31 Марта, 2009 - 10:32:19)

 
My status
 Top
Champion Супермодератор
Отправлено: 31 Марта, 2009 - 11:12:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




loisop пишет:
Я парсю хтмл (каждый раз - разный... размер заранее неизвестен) прег_матч_алл'ом. Выдергиваю конкретные куски, заключенные между конкретных тегов. Кажный кусочек пишется в массив.
Вооот. Видишь, где на самом деле проблема?
Я думаю, есть возможность сразу проверять куски, заключенные между конкретными тегами на соответсвие элементам массива? Функции strstr, strpos к вашим услугам.
 
 Top
loisop
Отправлено: 31 Марта, 2009 - 20:01:00
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
возможность сразу проверять куски

может быть и есть, но я такую не знаю.. функция preg_match_all кидает кусочки СРАЗУ в массив..

(Отредактировано автором: 31 Марта, 2009 - 20:03:29)

 
 Top
Champion Супермодератор
Отправлено: 01 Апреля, 2009 - 10:10:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




loisop пишет:
может быть и есть, но я такую не знаю
Она есть. Я не в этом смысле. Я имел в виду, есть ли возможность подпроавить, чтоб это реализовать? Или этого делать нельзя?
preg_match_all кидает куски сразу в массив - да. После каждой проверки тебе preg_match (preg_match_all не нужен, если куски по одному проверяешь) возвращает массив, как я представляю, из 2 элементов - соответствие шаблону целиком(нулевой) и соответствие тому, что в скобках (в скобках ты укажешь ту часть, которая соответствует тексту.
'/\<tag\>(.+)\<tag\>/')(первый). Вот в первом элементе массива ты проверяешь выше написанными фунциями наличие того, что тебе надо из первого массива
 
 Top
AlexGreF
Отправлено: 01 Апреля, 2009 - 10:23:13
Post Id



Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Март 2009  
Откуда: Амурка


Помог: 0 раз(а)




А чем не нравится массив в массиве?

(Отредактировано автором: 01 Апреля, 2009 - 10:33:24)



-----
Моё место во фрилансе - http://weblancer[dot]net/users/alexsava
 
 Top
Stierus Супермодератор
Отправлено: 01 Апреля, 2009 - 10:47:31
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Повторюсь ещё раз и забью на тему:

Есть 2 оптимальных случая:
1. при парсинге html-странички в регулярных выражениях сразу учитывать тот первый массив заранее известных фраз (прям в регулярном выражении ищутся сразу соответствия, тоесть савмо выражение либо генерируется налету из массива исходного, либо ты его 1 раз пишешь ручками и меняешь при добавлении элементов в массив)
2. При парсинге оставить старое регулярное выражение, выдергивающее строку, но использовать не preg_match, а preg_replace_callback - тогда найденая строка вместо того, что бы попадать в массив и ждать некоей обработки, будет сразу поступать в функцию на обработку, где ты будешь в отпарсеной строке искать вхождения элементов массива.
(Добавление)
а по поводу вхождения элементов массива в строке уже тут писал http://forum.php.su/topic.php?fo...1&topic=1936
 
My status
 Top
loisop
Отправлено: 02 Апреля, 2009 - 19:10:26
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




К сожалению не мог раньше ответить.. Приношу свои извинения.

Огромное спасибо всем участвовавшим и сочувствовавшим.
Выручил последний пост - stripos оказался панацеей.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB