Спустя 1 минута, 59 секунд (9.04.2009 - 07:27) Joker написал(а):
Можно) Вот кстати токочто в другом посте выкладывал сылку) там PHP примеры. Там гостевая разжевания на до мелочей прочитай думаю сразу все станет ясным.
Спустя 34 минуты, 4 секунды (9.04.2009 - 08:01) Kuliev написал(а):
Athlete
Вот не большой пример, также можешь сделать и редактирование!
Вот не большой пример, также можешь сделать и редактирование!
PHP |
$sql = ("SELECT * FROM table"); |
Спустя 3 минуты, 2 секунды (9.04.2009 - 08:04) Joker написал(а):
Ну также не получиться) чтоб отредактировать форма нужна а не просто тыкнуть что редактировать.
Спустя 30 минут, 49 секунд (9.04.2009 - 08:35) Kuliev написал(а):
Цитата (Joker @ 9.04.2009 - 05:04) |
Ну также не получиться) чтоб отредактировать форма нужна а не просто тыкнуть что редактировать. |
В этом коде я удаляю записи, а вот редактировать пусть немного подумает где что добавить! А то всем бы все и даром!
Спустя 3 часа, 30 минут, 14 секунд (9.04.2009 - 12:05) Athlete написал(а):
Спасибо всем, буду пробовать
Спустя 8 минут, 37 секунд (9.04.2009 - 12:14) Athlete написал(а):
PHP |
if (isset($_GET['del') ? $_GET['del'] : null) |
Поясните работу цикла, пожалуйста. Не понимаю условие if
Спустя 48 минут, 31 секунда (9.04.2009 - 13:03) sergeiss написал(а):
Цитата (Athlete @ 9.04.2009 - 12:14) | ||
Поясните работу цикла, пожалуйста. Не понимаю условие if |
Если говорить честно, то приведенный "образец" - изврат полный!!!
1.
PHP |
if (isset($_GET['del') ? $_GET['del'] : null) |
легко сокращается до
PHP |
if (isset($_GET['del']) ) |
2. Цикл for в данном случае зачем? Лучше foreach
PHP |
foreach( $_GET['id'] as $val ) |
PS. В суть примера я даже не вникал, просто сразу бросилось в глаза то, о чем написал.
Спустя 8 минут, 19 секунд (9.04.2009 - 13:11) Kuliev написал(а):
Цитата (sergeiss @ 9.04.2009 - 10:03) | ||||||||||
Если говорить честно, то приведенный "образец" - изврат полный!!! 1.
легко сокращается до
2. Цикл for в данном случае зачем? Лучше foreach
PS. В суть примера я даже не вникал, просто сразу бросилось в глаза то, о чем написал. |
Какая разница между For и Foreach, в краткости написания или он в 3 раза быстрей перебирает????
Согласен что можно и так написать
PHP |
if (isset($_GET['del'])) |
Только в чем разница???
Спустя 16 минут, 58 секунд (9.04.2009 - 13:28) sergeiss написал(а):
Цитата (Kuliev @ 9.04.2009 - 13:11) | ||
Согласен что можно и так написать
Только в чем разница??? |
Можно понять, если бы ты написал присвоение
PHP |
$del_value=isset($_GET['del') ? $_GET['del'] : null; |
Но для условия в if это тавталогия типа "масло масляное", т.е. существенная переизбыточность.
Цитата (Kuliev @ 9.04.2009 - 13:11) | ||||
Какая разница между For и Foreach, в краткости написания или он в 3 раза быстрей перебирает???? |
foreach позволяет пройти по порядку по всем без исключения элементам массива. Будут у них цифровые ключи или символьные - не важно. Будут ли пропуски в нумерации, если цифровые ключи - тоже не важно.
А твой вариант цикла подразумевает, что ключи массива только цифровые и идут без пропусков.
Спустя 55 секунд (9.04.2009 - 13:29) Kuliev написал(а):
Вот еще статья для размышления я думаю никому лишней не будет!
Циклы: for, foreach, while, count/sizeof() - ускорение 15%-30%
В начале программы создается массив $test из целых чисел (100 000 элементов). Потом один раз запускаются приведенные ниже примеры. Цикл проходит данный массив 3-мя способами (разными циклами) и выполняет кое-какие операции. Не выполнять в цикле ничего нельзя, ибо это будет уже совсем не реальный тест.
Циклы: for, foreach, while, count/sizeof() - ускорение 15%-30%
В начале программы создается массив $test из целых чисел (100 000 элементов). Потом один раз запускаются приведенные ниже примеры. Цикл проходит данный массив 3-мя способами (разными циклами) и выполняет кое-какие операции. Не выполнять в цикле ничего нельзя, ибо это будет уже совсем не реальный тест.
PHP |
{$x=0; foreach($test as $n) { $x=sprintf("test%08i",$i); }} |
Почему sprintf, а не реальное echo? echo использовать нельзя, т.к. от него будет немерянный буфер (OUTPUT в браузер или консоль).
Теперь о деле. Бесспорный вывод - использование foreach сильно тормозит дело, а между for и while большой разницы нет. (На голом тесте for/while/foreach {..} тормоза foreach - 30%). Это не удивительно, т.к. foreach делает копию массива, на что тратиться масса времени (хотя это только слухи).
Вывод с count() не столь очевиден, потому что от разного текста в цикле % тормознутости от самого быстрого варианта резко возрастает... Я взял цикл с небольшой нагрузкой - проход по огромному массиву $test + форматирование функцией sprintf. Как видите, варинты с count() и заменяющей эту функцию перемнной $co различаются на 10% по скорости между собой (не смотрите на варинант с константой в 100000, заранее знать кол-во элементов невозможно).
Вывод о не ассоциативных массивах: 1) foreach существенно замедляет работу 2) использование count() в простых циклах - замедленение 10%. Но на сложных циклах потери от лишних запусков count() будут абсолютно незаметны, так что ситуация не очевидна.
Сравнение count() и sizeof().
Судя по мануалу - это алиасы. Об этом написано на страницах самих функций и дополнительной странице "Appendex => Aliases list". Что же мы видим на массиве в 100000 элементов:
PHP |
{$x=0; for ($it=0; $it<count($test); $it++) { $x=sprintf("test%08i",$test[$it]);}} |
Пусть тесты будут иметь погрешности... Но результат один - count() заметно отстает по скорости от sizeof()! Хм, я бы к записи в мануале сделал приписку: "The sizeof() function is an alias for count(), but последний сильно тормозит!"
Если кол-во элементов в массиве меньше 65000 (64К), то эти функции по скорости практически не различимы. Тут вывод простой - переходим на использование sizeof(), как ускоренного алиаса count(). Это принесет свои результаты на огромных массивах.
Ассоциативные массивы: тестирование разных способов перебора
С ними наблюдается таже проблема: на разных по величине массивах разные функции эффективны, но лучше всех foreach!
Массив в 200 элементов и 1000 повторов программы:
PHP |
{$x=0; foreach($test as $k=>$v) { $x=sprintf("%s=>%s\n",$k,$v); }} |
Резюме:
- sizeof() лучше, чем count()
- в циклах sizeof лучше вообще заменить на переменную
- for и while практически не отличимы
- для перебора простых индексных массивов нужно использовать for или while
- для перебора ассоциативных массивов нужно использотьва foreach
Источник статьи!
Спустя 5 минут, 59 секунд (9.04.2009 - 13:35) sergeiss написал(а):
Разница в скорости, говоришь?
"Сколько вешать в граммах?" (С)
Там если при миллионе циклов будет разница в тысячные доли секунды, то уже ладно. Да и то эту разницу еще надо суметь точно оценить.
А в реальном цикле (если в массиве несколько десятков или даже сотен элементов) эта разница будет настолько незаметна, что ее даже подсчитать нельзя будет.
Да еще и не факт вовсе, что for будет быстрее.
"Сколько вешать в граммах?" (С)
Там если при миллионе циклов будет разница в тысячные доли секунды, то уже ладно. Да и то эту разницу еще надо суметь точно оценить.
А в реальном цикле (если в массиве несколько десятков или даже сотен элементов) эта разница будет настолько незаметна, что ее даже подсчитать нельзя будет.
Да еще и не факт вовсе, что for будет быстрее.
Спустя 5 минут, 50 секунд (9.04.2009 - 13:41) sergeiss написал(а):
Цитата (Kuliev @ 9.04.2009 - 13:29) |
$x=sprintf("test%08i",$i); |
И еще позволь заметить (это типа "шпилька") - тот, кто проводил тест, даже не догадывался о том, что в указанном мной выражении (это из приведенного тобой теста) используется неоптимальный код. Который тормозит скрипт
Правильно в данном случае будет
PHP |
$x=sprintf('test%08i',$i); |
Мелочь, вроде бы. Но сколько-то процентов ускорения можно получить
Спустя 20 минут, 40 секунд (9.04.2009 - 14:01) Kuliev написал(а):
sergeiss
Я насколько заметил ты постоянно придераешся к массивам!
Конкретно к циклу FOR предлагая альтернативу FOREACH!
Извините, но я знаю какой массив и какую размерность я формирую в скрипте, согласно этому я и выбираю цикл перебора данного массива!
В приведенном мной примере кода индексом массива будет числовой массив а не ассоциативный, по этому я использую в нем цикл FOR
Хотя по большому счету разница при выборе цикла в данном коде не принципиальна, кому что нравиться!
Я насколько заметил ты постоянно придераешся к массивам!
Конкретно к циклу FOR предлагая альтернативу FOREACH!
Извините, но я знаю какой массив и какую размерность я формирую в скрипте, согласно этому я и выбираю цикл перебора данного массива!
В приведенном мной примере кода индексом массива будет числовой массив а не ассоциативный, по этому я использую в нем цикл FOR
Хотя по большому счету разница при выборе цикла в данном коде не принципиальна, кому что нравиться!
Спустя 13 минут, 18 секунд (9.04.2009 - 14:15) sergeiss написал(а):
Ты лучше не спорь, а запусти свой пример... Он не будет работать
1. Потому что там допущена одна существенная ошибка: у тебя не набор чекбоксов, а один чекбокс, судя по его имени. Которое не является массивом.
Поэтому в форму для обработки будет передано значение последнего из чекбоксов.
2. Даже если ты и сделаешь имя name="id[]", то все равно не будет работать. Потому что на принимающей стороне в массиве $_GET['id'] будут не все чекбоксы, как ты предполагаешь, а только те, что были выбраны.
Поэтому там будет как раз массив с пропусками индексов. Для которого только foreach подойдет.
Можно будет и for использовать... Но только вовсе не так, как ты это делаешь. А немного по-другому. Но все равно по сути это получится тот же foreach
Так зачем мудрить? Может, сразу использовать то, что надо?
1. Потому что там допущена одна существенная ошибка: у тебя не набор чекбоксов, а один чекбокс, судя по его имени. Которое не является массивом.
Поэтому в форму для обработки будет передано значение последнего из чекбоксов.
2. Даже если ты и сделаешь имя name="id[]", то все равно не будет работать. Потому что на принимающей стороне в массиве $_GET['id'] будут не все чекбоксы, как ты предполагаешь, а только те, что были выбраны.
Поэтому там будет как раз массив с пропусками индексов. Для которого только foreach подойдет.
Можно будет и for использовать... Но только вовсе не так, как ты это делаешь. А немного по-другому. Но все равно по сути это получится тот же foreach
Так зачем мудрить? Может, сразу использовать то, что надо?
Спустя 14 минут, 7 секунд (9.04.2009 - 14:29) Kuliev написал(а):
Цитата |
sergeiss 2. Даже если ты и сделаешь имя name="id[]", то все равно не будет работать. Потому что на принимающей стороне в массиве $_GET['id'] будут не все чекбоксы, как ты предполагаешь, а только те, что были выбраны. Поэтому там будет как раз массив с пропусками индексов. Для которого только foreach подойдет. |
Все исправил, все работает отлично!
Мне и нужны только отмеченные чекбоксы для удаления!!!
PHP |
Array |
Спустя 5 часов, 23 минуты, 48 секунд (9.04.2009 - 19:52) kirik написал(а):
Оо..) Опять холивор по поводу производительности
У вас уже все работает, а я с недавних пор вместо foreach стал использовать while. Результат тот же что и у foreach, но без потерь в памяти
У вас уже все работает, а я с недавних пор вместо foreach стал использовать while. Результат тот же что и у foreach, но без потерь в памяти
PHP |
while(list($key, $val) = each($array)) |
Или для конкретного случая:
PHP |
while(list(, $val) = each($_GET['id'])) |
*первая переменная в list() пропущена не случайно.
ЗЫ. отвлекся от цикла, взгляд упал на запрос.. Ну кто же делает запросы в цикле?
Спустя 11 часов, 37 секунд (10.04.2009 - 06:53) Kuliev написал(а):
kirik
Цитата |
ЗЫ. отвлекся от цикла, взгляд упал на запрос.. Ну кто же делает запросы в цикле? |
Объясни как удалить несколько строк из БД не используя цикл!!!
Спустя 14 минут, 54 секунды (10.04.2009 - 07:08) Joker написал(а):
Просто)
PHP |
mysql_query("DELETE FROM `table` WHERE `id`='1' OR `id`='2'"); |
PHP |
mysql_query("DELETE FROM `table` WHERE `id`>'1'"); |
PHP |
mysql_query("DELETE FROM `table` WHERE `id`<>'1'"); |
Спустя 11 минут, 53 секунды (10.04.2009 - 07:20) Kuliev написал(а):
Цитата (Joker @ 10.04.2009 - 04:08) | ||||||
Просто)
|
Это понятно, но у меня если ты заметил из массива разные ID!
Спустя 3 минуты, 14 секунд (10.04.2009 - 07:23) Joker написал(а):
Фонтазию подключи))) Темболее первый запрос там разные ид написаны читай внимательнее.
PHP |
mysql_query("DELETE FROM `table` WHERE |
Могу еще сказать как из масива с ид сделать такую строку)
Спустя 1 час, 10 минут, 19 секунд (10.04.2009 - 08:33) sergeiss написал(а):
Ежели очень НЕ нравится foreach, то можно и так делать (я сам же об этом недавно где-то тут писал ):
PHP |
// пусть $arr - массив с данными |
Можно убрать "!= false" в условии, но будет менее наглядно.
Но только в итоге получаем, по сути дела, тот же самый foreach!!!
Спустя 21 минута, 39 секунд (10.04.2009 - 08:55) kirik написал(а):
Цитата (Kuliev @ 9.04.2009 - 22:53) |
Объясни как удалить несколько строк из БД не используя цикл!!! |
SQL |
DELETE FROM `table` WHERE `id` IN(1,3,5,2) |
или как Joker написал с помощью OR (так как при большом количестве удаляемых записей ("от нескольких сотен до нескольких тысяч записей") IN будет тупить. Доказано FatCat)
Спустя 2 часа, 23 минуты, 4 секунды (10.04.2009 - 11:18) Kuliev написал(а):
Цитата (sergeiss @ 10.04.2009 - 05:33) | ||
Ежели очень НЕ нравится foreach, то можно и так делать (я сам же об этом недавно где-то тут писал ):
Можно убрать "!= false" в условии, но будет менее наглядно. Но только в итоге получаем, по сути дела, тот же самый foreach!!! |
Вот видишь, что и следовало доказать! Вариантов много как решить одну задач. Каждый выбирает то что ему нравиться и то что он считает лучшим!
Цитата |
Цитата (Kuliev @ 9.04.2009 - 22:53) Объясни как удалить несколько строк из БД не используя цикл!!! SQL DELETE FROM `table` WHERE `id` IN(1,3,5,2) или как Joker написал с помощью OR (так как при большом количестве удаляемых записей ("от нескольких сотен до нескольких тысяч записей") IN будет тупить. Доказано FatCat) |
Спасибо учту на будущее!
Спустя 49 минут, 26 секунд (10.04.2009 - 12:08) sergeiss написал(а):
Цитата (Kuliev @ 10.04.2009 - 11:18) | ||||
Вот видишь, что и следовало доказать! Вариантов много как решить одну задач. Каждый выбирает то что ему нравиться и то что он считает лучшим! |
Как раз это доказывает, что лучше использовать foreach Не зря же его придумали.
PS. Я это говорю больше не для сравнения разных типов циклов, они хороши каждый для своих целей. А больше для того, что мне непонятно, зачем люди начинают "изобретать велосипеды": кто-то хочет делать всё через один тип цикла, хотя он не везде удобен; другой хочет сделать работу с данными через файлы, вместо БД; ну и так далее в том же духе. Вот только ЗАЧЕМ?
Спустя 1 час, 37 минут, 58 секунд (10.04.2009 - 13:46) Kuliev написал(а):
sergeiss
Цитата |
Вот только ЗАЧЕМ? |
Ну наверное все приходит с ОПЫТОМ!
Спустя 2 месяца, 19 дней, 18 часов, 54 минуты, 55 секунд (30.06.2009 - 08:40) Athlete написал(а):
Kuliev
Подскажи, что ты исправил, так и не разобрался с данной задачей. Я так понимаю, что для того чтобы кнопка submit работала, нужна форма, нужен обрабатывающий скрипт, а в варианте, который ты предлагаешь я не вижу ни формы, ни скрипта.
Подскажи, что ты исправил, так и не разобрался с данной задачей. Я так понимаю, что для того чтобы кнопка submit работала, нужна форма, нужен обрабатывающий скрипт, а в варианте, который ты предлагаешь я не вижу ни формы, ни скрипта.
Спустя 51 минута, 46 секунд (30.06.2009 - 09:32) twin написал(а):
Цитата |
У вас уже все работает, а я с недавних пор вместо foreach стал использовать while. Результат тот же что и у foreach, но без потерь в памяти |
А ты в курсе, что while медленнее чем foreach почти в 10 раз?
Спустя 1 час, 42 минуты, 15 секунд (30.06.2009 - 11:14) Alchemist написал(а):
twin, откуда дровишки ?
Спустя 31 минута (30.06.2009 - 11:45) twin написал(а):
Мерял )))
Спустя 15 минут, 58 секунд (30.06.2009 - 12:01) jetistyum написал(а):
очередной спор на сколько наносекунд один оператор быстрее другого
да фигня все это.... и for и foreach обычно не используют на больших массивах, тем более по много раз... если гнаться за производительностью, нужно забыть про разного рода фреймворки сразу... но посмотрите тенденцию.... по поиску работы нужны только программеры на фреймворках ZF, Symfony, etc. потому что если нужна производительность, то не проблема взять нормальный хостинг, нужна еще больше - еще более нормальный, т.к. производительность сказывается на проектах не типа "гостевая книга" ... а там где хороший проект, хорошая посещаемость и прибыль, совсем не сложно взять нормальный хостинг, а не гнаться за оптимизацией каждого for вместо foreach (я не отрицаю идею оптимального написания кода, но только не в "параноидальной форме") лично я всегда писал везде foreach ... и ни один проект от этого не загнулся ну удобнее мне так... оптимальнее может и писать for .... а еще оптимальнее на питоне, C++, С, а может и на асме
да фигня все это.... и for и foreach обычно не используют на больших массивах, тем более по много раз... если гнаться за производительностью, нужно забыть про разного рода фреймворки сразу... но посмотрите тенденцию.... по поиску работы нужны только программеры на фреймворках ZF, Symfony, etc. потому что если нужна производительность, то не проблема взять нормальный хостинг, нужна еще больше - еще более нормальный, т.к. производительность сказывается на проектах не типа "гостевая книга" ... а там где хороший проект, хорошая посещаемость и прибыль, совсем не сложно взять нормальный хостинг, а не гнаться за оптимизацией каждого for вместо foreach (я не отрицаю идею оптимального написания кода, но только не в "параноидальной форме") лично я всегда писал везде foreach ... и ни один проект от этого не загнулся ну удобнее мне так... оптимальнее может и писать for .... а еще оптимальнее на питоне, C++, С, а может и на асме
Спустя 51 минута, 20 секунд (30.06.2009 - 12:53) twin написал(а):
Во пробило
Да не спорил ни кто, просто я к сведению. Недавно мерял, вот к слову и пришлось. А то что не гнаться за оптимизацией - это ты зря. Сегодня один хостинг, завтра другой... Продукт должен быть качественным вне зависимости от.
Да не спорил ни кто, просто я к сведению. Недавно мерял, вот к слову и пришлось. А то что не гнаться за оптимизацией - это ты зря. Сегодня один хостинг, завтра другой... Продукт должен быть качественным вне зависимости от.