С языка Delphi я помню , что такое вложенные цыклы друг в друга. В данном случае я столкнулся с вложением цыкла for в цыкл for (классический случай).
Немогу понять как он работает и и опять же немогу понять зачем приводить такие примеры в самоучителе для начинающих чтобы обьяснить вложение цыклов
Итак имеем скрипт (нахождение простых чисел)
PHP |
<?php for ($i = 2; $i < 100; $i++) { for ($j = 2; $j < $i; $j++) { if (($i%$j)!=0) continue; else { $flag = true; break; } } if(!$flag) echo $i." "; $flag = false; } |
Результат работы скрипта
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Разбираем скрипт.
Итак обявляем цыкл for счётчик которог от 2 до 99 и увеличиваем каждый раз переменную $i на 1.
Далее влаживаем в этот цыкл еще один цыкл for счётчик которого считает от 2 до значение переменной $i-1. переменную $j увеличиваем на 1.
далее во внутренем цыкле пользуемся оператором if и если деление по модулю переменной $i и $j не равно 0 , то переходим в начало цыкла, иначе переменной $flag присваиваем значение true и прерываем внутрений цыкл.
Далее во внешнем цыкле идёт проверка и если инверсия переменной $flag вернет истину то печатаем переменную $i и устанавливаем $flag в значение ложь.
Парадоксальность в том, что во внутренем цыкле
PHP |
for ($j = 2; $j < $i; $j++) { if (($i%$j)!=0) continue; else { $flag = true; break; } |
переменной $flag будет всегда присвоенно значение истина потому ,что если при делении по модулю получаеться число больше 0 , то цыкл переходит в нало и так до тех пор покамисть деление не станет 0 либо покамисть не выполниться условие $j => $i. тоесть переменой $flag будет всегда присвоенно значение истина и следую из кода дальше оператор echo $i." "; некогда не выполинться потому, что проверка if(!$flag) всегда будет возращять результат false.
Второй парадокс в том , что в результате скрипта на первом месте стоит число 2. Чтобы напечатать число 2 нужно чтобы переменная $i была равна 2, а так как в самом начале внешнего цыкла эта переменная увеличиваеться на 1
PHP |
for ($i = 2; $i < 100; $i++) |
то как так может случиться?
Спустя 24 минуты, 47 секунд (2.05.2009 - 00:17) kirik написал(а):
Цитата (Han @ 1.05.2009 - 15:52) |
Чтобы напечатать число 2 нужно чтобы переменная $i была равна 2, а так как в самом начале внешнего цыкла эта переменная увеличиваеться на 1 |
Не совсем верно. Так как при первом проходе цикла переменная $i равна двум, а уже при втором проходе она увеличивается на 1:
PHP |
$i = 1; echo $i++; echo '<br />'; echo $i; |
Цитата (Han @ 1.05.2009 - 15:52) |
тоесть переменой $flag будет всегда присвоенно значение истина |
Почему это вдруг? Попробуй к каждому из чисел что вывелись найти делитель, который будет больше 2, но меньше самого числа. Нету? Именно поэтому эти числа и вывелись (тоесть else во втором цикле не сработал).
Спустя 4 минуты, 35 секунд (2.05.2009 - 00:21) Han написал(а):
разве при обьявлении параметров цыкла
PHP |
for ($i = 2; $i < 100; $i++) |
Увелечение на 1 $i++ делаеться не сразу? а потом после этого когда $і ,будет равно 3 выполняеться тело цыкла
Спустя 4 минуты, 11 секунд (2.05.2009 - 00:25) Han написал(а):
Цитата |
Почему это вдруг? Попробуй к каждому из чисел что вывелись найти делитель, который будет больше 2, но меньше самого числа. Нету? Именно поэтому эти числа и вывелись (тоесть else во втором цикле не сработал). |
Так смотри если число не равно 0 то оператором continue переходим на начало цыкла опять если иначе то $flag = true;
Спустя 2 минуты, 10 секунд (2.05.2009 - 00:28) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:21) |
Увелечение на 1 $i++ делаеться не сразу? а потом после этого когда $і ,будет равно 3 выполняеться тело цыкла |
$i = 2; выполняется в самом начале цикла и только один раз
$i < 100; это условие будет выполняться в начале каждой новой итерации (повторения)
$i++ будет выполняться в конце каждой итерации
Спустя 4 минуты, 20 секунд (2.05.2009 - 00:32) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:25) |
Так смотри если число не равно 0 то оператором continue переходим на начало цыкла опять если иначе то $flag = true;
|
Да, но если остаток деления так и не стал равным 0, то вложенный цикл заканчивается, а if(!$flag) срабатывает (к первому числу срабатывает потому что $flag еще не определен, а следовательно false; а к последующим числам этот false достается от предыдущей итерации, так как в любом случае в конце цикла $flag устанавливается в false).
Спустя 1 минута, 40 секунд (2.05.2009 - 00:34) Han написал(а):
PHP |
$i++ будет выполняться в конце каждой итерации. |
Тоесть выполняеться после выполнения тела цыкла?
Спустя 1 минута, 23 секунды (2.05.2009 - 00:35) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:34) |
Тоесть выполняеться после выполнения тела цыкла? |
Ну выходит что так

А разве в делфях по-другому?
Спустя 51 секунда (2.05.2009 - 00:36) Han написал(а):
Ты мне столько тонкостей расказываеш( Я в шоке от своего самоучителя. Повезло что есть у кого спросить!
Спустя 2 минуты, 42 секунды (2.05.2009 - 00:38) Han написал(а):
PHP |
Ну выходит что так А разве в делфях по-другому? |
там счётчик не так работает например for i:=1 to 10 do тело цыкла
тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла.
Спустя 1 минута, 59 секунд (2.05.2009 - 00:40) kirik написал(а):
Да это как бы не тонкости

Это все описано на
php.net (Просто в поиске вводи что интересует, например "
for"), а самомучитель и вправду какой-то странный
Спустя 2 минуты, 37 секунд (2.05.2009 - 00:43) Han написал(а):
У меня с английским не очень. А ты свободно можеш читать английский справочник? я пользуюсь php.su
Спустя 1 минута, 49 секунд (2.05.2009 - 00:45) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:38) |
там счётчик не так работает например for i:=1 to 10 do тело цыкла
тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла. |
Понятно. Не, тут вот немного по-другому. Тоесть если тебе нужно сделать 10 итераций, то есть несколько вариантов:
1 - for($i = 0; $i < 10; $i++) (когда $i начинается с 0)
2 - for($i = 1; $i < 11; $i++) (когда $i начинается с 1)
3 - for($i = 1; $i <= 10; $i++) (когда $i начинается с 1)
Спустя 4 минуты, 23 секунды (2.05.2009 - 00:49) Han написал(а):
Это у меня написано я понял. Просто я не смог разобрать скрипт потому что не знал , что увеличение на 1 происходит после тела цыкла тоесть в конце и не знал что необьявленная переменная будет иметь значение ложь.
запись вида
for($i = 0; $i < 10; ++$i)
тоже вполне рабочая?
Спустя 29 секунд (2.05.2009 - 00:50) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:43) |
У меня с английским не очень. А ты свободно можеш читать английский справочник? |
Да, у меня нет проблем с английским

А вот если ты чаще будешь читать/переводить то через месяц уже сможешь понимать о чем в тексте идет речь
php.su тоже не плох, но я не раз замечал что в английской версии более подробно разбираются некоторые моменты, а в русской версии их просто нет.
Живой пример:
file() на русском и
file() на английском. Как видно в русской не описан параметр $flags.
Спустя 1 минута, 51 секунда (2.05.2009 - 00:52) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:49) |
запись вида
for($i = 0; $i < 10; ++$i)
тоже вполне рабочая? |
Да, конечно

Забыл про такой случай.
Спустя 35 секунд (2.05.2009 - 00:52) Han написал(а):
Цитата |
А вот если ты чаще будешь читать/переводить то через месяц уже сможешь понимать о чем в тексте идет речь |
Согласись всё равно для этого нужно выучить синтаксис английскоко языка. Построение предложение, времена, неправельные глаголы. А я тут по русски не могу понять с самоучителя для новичков.
Спустя 7 минут, 19 секунд (2.05.2009 - 00:59) Han написал(а):
А вот еще вопрос такой очень меня интересующий. Я сейчас дошел уже до перечесления функция разных и по мере изучения книги я начинаю забывать по неможку старое например цыкл while немного подзабыл (в принцыпи чётко помню как он работает но без книжки не смогу сейчас написать скрипт с его использованием). Тоесть по мере изучения книги я начинаю забывать мелочи которы были прочитаны страниц 30-50 назат. Как с этим ты боролся когда начинал учить PHP? Например я знаю только , что нужно много практики тогда всё чётко запоминаеться но пркатики нету потому ,что канкретных задач нету. тоесть я не знаю что мне можно написать такое. Когда я учил делфи то помню к каждому зыклу давалось по 5 задач для решения с использованием в разных вариацыях толька , что прочитаного цыклаи это мне очень помогало всё яётко запомнить. Долго у тебя ушло на изучение PHP , чтобы более менее можно было что то писать серьезное.?
Спустя 19 минут, 26 секунд (2.05.2009 - 01:19) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:59) |
Как с этим ты боролся когда начинал учить PHP? |
Я с этим ни как не боролся

Я просто учился не по книжке, а разбирая готовые скрипты методом тыка. Конечно у меня были какие-то понятия о языке программирования (еще со школы), что есть переменная, константа, и прочие начальные определения.
Конечно без практического применения ты будешь забывать как что-то работает, но на самом деле и не нужно помнить вообще все

Цикл while говорит сам за себя (слово while переводится как "пока"). Тоесть "пока(условие в скобочах верно) { выполняем тело }".
Не занимайся сухой теорией. Напиши что-нибудь простенькое (очень любят писать гостевые книги как первую программку). А потом по мере изучения чего-то более сложного дописывай гостевуху до форума, итд

Цитата (Han @ 1.05.2009 - 16:59) |
Долго у тебя ушло на изучение PHP , чтобы более менее можно было что то писать серьезное.? |
Первое что я написал (а точнее собрал по кускам и заставил работать) это была банерокрутилка(на БД), которая не показывала на одной странице одинаковые баннеры. Потом прикрутил к ней админку. Но "с чистого листа" не мог писать наверное где-то полгода.
Спустя 3 минуты, 24 секунды (2.05.2009 - 01:22) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:52) |
Согласись всё равно для этого нужно выучить синтаксис английскоко языка. Построение предложение, времена, неправельные глаголы. |
Тебе не нужны ни времена ни неправильные глаголы. Ты ведь не собираешься пока писать/говорить. А для того чтобы понимать смысл предложения достаточно запомнить некоторое количество слов
Спустя 7 минут, 18 секунд (2.05.2009 - 01:30) Han написал(а):
Цитата |
не занимайся сухой теорией. Напиши что-нибудь простенькое (очень любят писать гостевые книги как первую программку). А потом по мере изучения чего-то более сложного дописывай гостевуху до форума, итд |
Понимаеш дело в том что мне не хватит моих нынешних знаний чтобы написать гостевуху я из книги не понял как работает метод GET и POST. Понял только что этот метод передаёт переменные введенные в форму в масив $_GET и $_POST. Так же не понял как работать с формой. Поєтому хотелось бы что то написать чтобы всё это закрепить но не могу так как нечего.
Ты когда пишеш скрипты книгами пользуешся?
Спустя 6 минут, 39 секунд (2.05.2009 - 01:36) kirik написал(а):
Цитата (Han @ 1.05.2009 - 17:30) |
не понял как работает метод GET и POST |
Как совет - не ходи дальше, пока не разберешься до конца с тем, что изучаешь.
Цитата (Han @ 1.05.2009 - 17:30) |
Понял только что этот метод передаёт переменные введенные в форму в масив $_GET и $_POST. |
Ну да, как-то так
Цитата (Han @ 1.05.2009 - 17:30) |
Так же не понял как работать с формой. |
Разберись обязательно. Ничего сложного нет, но это использыется всегда и везде.
Цитата (Han @ 1.05.2009 - 17:30) |
Ты когда пишеш скрипты книгами пользуешся? |
Не. Максимум чем пользуюсь - php.net, и то когда забываю какие-нибудь функции.
Спустя 5 минут, 7 секунд (2.05.2009 - 01:41) Han написал(а):
Цитата |
Как совет - не ходи дальше, пока не разберешься до конца с тем, что изучаешь. |
У меня внешние переменные описываються вначале книги сразу после установки апач.
Я со всем разбераюсь в принцыпи нормально и уверенно единственная проблема что начинаю подзабывать мелочи.
И если я сейчас и смогу что то написать то буду подглядівать по главам на форму записи того или иного и вариации записи.
Спустя 2 минуты, 24 секунды (2.05.2009 - 01:44) kirik написал(а):
Цитата (Han @ 1.05.2009 - 17:41) |
единственная проблема что начинаю подзабывать мелочи. |
Эт фигня

Главное ты разобрался, а потом вспомнить - уже не составит проблем.
Спустя 7 минут, 43 секунды (2.05.2009 - 01:52) Han написал(а):
ладно спасиб за хорошие советы буду идти спать, на часах 2 ночи.
Спустя 1 день, 20 часов, 30 минут, 56 секунд (3.05.2009 - 22:22) sergeiss написал(а):
Цитата (Han @ 2.05.2009 - 00:38) |
PHP | Ну выходит что так А разве в делфях по-другому? |
там счётчик не так работает например for i:=1 to 10 do тело цыкла
тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла.
|
В дельфях тоже в конце цикла будет увеличение, т.е. в твоем примере переменная i будет равна 1 на первом проходе через тело цикла. А по твоим словам получается, что вовсе не так дело обстоит...
И в языке Си, и в Си++, и даже в Бейсике на первом проходе цикла переменная цикла равна начальной величине! И язык ПХП не является исключением.
Что касается описалова на русском - см. ссылку в моей подписи, качай оттуда и изучай.
_____________
Никогда не бойся делать то, что ты пока не умеешь. Помни, Ковчег был построен любителем. Профессионалы построили "Титаник".