Помогите с php
601 повідомлення
#15 років тому
Варианта в данном случае два.1) регулярки, если пофик на производительность. Я не знаю, насколько хорошо в PHP реализованы(точнее свистнуты из PCRE) регулярки, по идее эта задача должна решаться за 1 прогон.
2) Самый правильный. Если производительность интересна(производительность??? На PHP??) - делайте сами. Метод конечных автоматов(если дозволено мне будет поминать имя метода этого в такой задаче). Ну реально 3 минуты это пишется, чего лениться то??
Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2. Так что строго говоря, для данной задачи вариант проходит, но write-only, при дальнейшем усложнении задачи такой код должен быть не модифицирован а переписан. Учитесь предвосхищать потребности заказчика, очень от многих проблем в будущем спасет...
И вообще, друзья, ну учите матчасть уже, а... Очень не хочется вас всех школьниками называть, но после такого:
Цитата ("Demiurh"):
Цитата (eXsofter):
if( в строке адреса браузера нету слова 'news' и слова 'forum'' ) echo 1;
...
Фикус в том, что в задании говорится И, а в решении ИЛИ.
В общем нет слов. Уроки информатики, лично у меня - 8 вроде бы, плохо помню, класс. Алгебра логики. Ну либо, кому не повезло, и в школе информатики не было - надо восполнять такие пробелы, прежде чем программистами себя называть...
!a & !b = !(a&b) - запомните, дети, а лучше запишите.
Прогонять две регулярки, если их можно обьединить в одну и взять отрицание - плохо. Запомните, а лучше выжгите пальцах!
Метод конечных автоматов - хорошо! В том случае, если на него потратится 3 минуты, использовать его а не пользоваться встроенными в PHP функциями - хорошо!
И не ухудшит это восприятия кода нихрена! Наоборот, если человек мало работал в PHP со строками, ему куда проще будет понять нормальный цикл, где проходятся по всем знакам строки, чем лазить по учебникам в поисках strpos!
Цитата ("Lisio"):
Программист не знающий о регулярных выражениях - не программист.
Шикарное утверждение. Люди, пишущие на ассемблере - не программисты.
Люди, которые пишут не сайтики, на которых надо много работать с текстом, а программы управления спутниками - жалкие ламеры, поскольку т.к. там текста нет - одни цифры, с регулярками они работать, по вполне понятным причинам, умеют не очень хорошо.
Да даже те, кто пишут игры(не онлайн, с нормальной графикой и физикой) - и те ламеры. Потому что там регулярки если и используются, то крайне редко....
12 повідомлень
248 повідомлень
#15 років тому
Цитата ("dervinar"):Метод конечных автоматов(если дозволено мне будет поминать имя метода этого в такой задаче). Ну реально 3 минуты это пишется, чего лениться то??
Ну и регулярки основаны на нем. посилання
Код регулярок написан на Си и скомпилирован. С чего собственной реализации конечных автоматов быть быстрее.
Цитата ("dervinar"):
Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2..
Этого я не заметил.
Цитата ("dervinar"):
Наоборот, если человек мало работал в PHP со строками, ему куда проще будет понять нормальный цикл, где проходятся по всем знакам строки, чем лазить по учебникам в поисках strpos!
Напоминаю, циклы в php работают медленней аналогичных в Си.
Цитата ("dervinar"):
чем лазить по учебникам в поисках strpos!
Найти нужную функцию 2 минуты, а после она откладывается в мозгу и мануал используется исключительно для уточнения.
601 повідомлення
12 повідомлень
#15 років тому
Цитата ("dervinar"):Если не секрет, где именно Вы увидели перемешивание фактов?
По сути, вы предлагаете использовать алгоритмы и логику из одной сферы применения (в которой она оправдана и работает хорошо) - в другой,
в которой более важна скорость написания, логичность и читабельность кода на более высоком уровне абстракции.
К примеру, я как PHP программист, вникая в чужой код, буду рад видеть там одну "близкую сердцу" строку с preg_match(...), чем искать смысл внутри тела незнакомого мне цикла (особенно если нет комментариев) и т.п.
601 повідомлення
#15 років тому
Цитата ("werewolf"):Цитата (dervinar):
Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2.
.
Этого я не заметил.
Только из за малой длины подаваемой строки. Просто циклы в PHP толи кэшируются, толи еще что-то...
Следует лишь увеличить длину строки, как все встанет на свои места:
strpos(2 word): 0.192898035049
strpos(4 word): 0.422738075256
А вот и сам код, проверьте....
$max = 100000;
$uri = strtolower('посилання;);
$start = microtime(true);
for($i=0;$i<$max;$i++)
{
if (strpos($uri, 'forum') === false && strpos($uri,'news') === false )
{
}
}
$end1 = microtime(true)-$start;
$start = microtime(true);
for($i=0;$i<$max;$i++)
{
if (strpos($uri, 'page') === false && strpos($uri, 'guestbook') === false && strpos($uri,'news') === false )
{
}
}
$end2 = microtime(true)-$start;
echo "strpos(2 word): $end1\n";
echo "strpos(4 word): $end2\n";
601 повідомлення
#15 років тому
Добавил регулярки, слова те же, длина строки та же.strpos(2 word): 0.188319921494
strpos(4 word): 0.402966976166
preg_match(2 word): 0.162349939346
preg_match(4 word): 0.20379114151
Что и следовало ожидать.
Цитата ("AmarenoCom"):
По сути, вы предлагаете использовать алгоритмы и логику из одной сферы применения (в которой она оправдана и работает хорошо) - в другой,
в которой более важна скорость написания, логичность и читабельность кода на более высоком уровне абстракции.
К примеру, я как PHP программист, вникая в чужой код, буду рад видеть там одну "близкую сердцу" строку с preg_match(...), чем искать смысл внутри тела незнакомого мне цикла (особенно если нет комментариев) и т.п.
Как альтернативу более правильному, с моей точки зрения, и академичному подходу я предлагаю использование регулярок.
Разумеется, нелепо требовать от PHP кодеров, особенно тех, кто не желает стремиться к совершенству, оптимального кода. В настоящий момент новый сервер зачастую стоит дешевле хорошего программиста...
12 повідомлень
#15 років тому
Цитата ("dervinar"):особенно тех, кто не желает стремиться к совершенству

Понятие "стремиться к совершенству" у каждого свое.
Для кого то - важно быстрее сделать инет-магазин и дать старт продажам.
Для кого то - важно выиграть 1 микросекунду во времени выполнения кода.
Главное - гармония

601 повідомлення
#15 років тому
Цитата ("AmarenoCom"):
Главное - гармония
Это точно=)
Но только в том случае, если стимулы такие, положительные) "Быстрее сдать", или "сделать лучше". А вот если стимул "лениво учиться", или, не дай бог "и так прокатит" - это уже никакого отношения к совершенству не имеет)
626 повідомлень
#15 років тому
Цитата ("dervinar"):В общем нет слов. Уроки информатики, лично у меня - 8 вроде бы, плохо помню, класс. Алгебра логики. Ну либо, кому не повезло, и в школе информатики не было - надо восполнять такие пробелы, прежде чем программистами себя называть....
Конечно приятно чувствовать себя самым крутым и умным, но:
1. Что написано в задании - если нет слова "news" И слова "forum". Это значит что одиночные слова не должны "ловиться", а только в связке.
2. В предложенном решении написано - если нет слова "news" ИЛИ слова "forum". Разницу с п.1 объяснять надо?
3. Цитата ("dervinar"):
!a & !b = !(a&b)- это бред. Так переврать закон де Моргана... Должно быть так - !a & !b = !(a | b)
601 повідомлення
#15 років тому
Цитата ("Demiurh"):!a & !b = !(a&b)
- это бред. Так переврать закон де Моргана... Должно быть так - !a & !b = !(a | b)
да, разумеется, ошибся. В формировании условия Вы не правы.
1172 повідомлення
#15 років тому
Цитата ("dervinar"):Шикарное утверждение. Люди, пишущие на ассемблере - не программисты.
Люди, пишущие сайты на ассемблере - не люди. Это конченые мутанты. А не разбираясь в регулярках нечего вообще делать в веб-кодинге. И особенно в чужой код не надо свой нос совать, коли не понимаешь! Narod.ru для таких всегда открыт.
Цитата ("Demiurh"):
1. Что написано в задании - если нет слова "news" И слова "forum". Это значит что одиночные слова не должны "ловиться", а только в связке.
2. В предложенном решении написано - если нет слова "news" ИЛИ слова "forum". Разницу с п.1 объяснять надо?
Надо понимать не только дословно, а что человеку действительно надо. В данном случае не должно встречаться даже одно из вышеперечисленных слов. Зная только одни точные науки нормально с людьми общаться не получится. Особенно во фрилэнсе, где от этого зависит твой доход.
248 повідомлень
#15 років тому
Цитата ("Lisio"):Люди, пишущие сайты на ассемблере - не люди. Это конченые мутанты.
Про таких людей никто речь не вел.
Цитата ("Lisio"):
А не разбираясь в регулярках нечего вообще делать в веб-кодинге.
Можно много чего.
1172 повідомлення
#15 років тому
Цитата ("werewolf"):Можно много чего.
Но мало чего хорошего. Потом за такими "много чего" сидишь и выбрасываешь 3/4 кода ненужного.
Вот такое условие if(strpos($uri,'news'




601 повідомлення
#15 років тому
Цитата ("Lisio"):Но мало чего хорошего. Потом за такими "много чего" сидишь и выбрасываешь 3/4 кода ненужного.
Тут момент такой... Регулярки, разумеется, отдавая дань Perl'у знать надо, и применять везде, где нужно тоже надо.
Более того, как я показал - тут они будут более производительны, чем strpos.
Но применять их следует не бездумно.
248 повідомлень
#15 років тому
Цитата ("dervinar"):Но применять их следует не бездумно
Правильно.
В тех тестах REQUEST_URI была очень короткой, как и бывает обычно, условий было мало и strpos оправдан.
На это сообщение можете не отвечать.
601 повідомлення
#15 років тому
Цитата ("werewolf"):В тех тестах REQUEST_URI была очень короткой, как и бывает обычно, условий было мало и strpos оправдан.
Оправдан? Чем?
Код с strpos менее компактен, труднее читаем, труднее модифицируется. Я еще могу согласиться, что по производительности strpos практически не отличается от регулярок, и на это можно забить. Но по всему остальному регулярки лучше...
Цитата ("werewolf"):
На это сообщение можете не отвечать.
Спасибо за заботу, мне, в общем то не трудно...