Обучение языка php с нуля. Циклы
- Об уроке
- Читать урок
Эта глава очень важна так как используется везде, написана она кусками так что местами будет сложно так что не пугайтесь, далее мы будем более подробно разбиратся с этим ужасом
Циклы в программировании — это повторяющиеся несколько раз операции.
Начало (точка отсчета) указывается в начале цикла, а продолжительность его выполнения ограничивается каким-либо условием.
Операторы цикла (iteration statements) повторяют заданную последовательность операторов фиксированное число раз или до тех пор, пока не будет удовлетворено условие проверки.
Существует три типа циклических операторов:
• while,
• do,
• for.
И операторы:
Break – прерывание цикла
Continue – повторение следующего цикла, игнорируя дальнейшие команды.
В алгоритмическом языке цикл пишется словом:
Пока (условие) то [ группа операторов]
Или можно усложнить:
Начало цикла
Пока (условие) то [ группа операторов]
Конец цикла
Если условие верно то обычно что оно возращает правду (истину) -- true
Если условие ложное то оно возвращает значение лож -- fasle
1. Конструкция while (выполнять до тех пор пока условие верно то.. )
Цикл while проверяет выражение, и в том случае, если оно равно true (то есть верное), выражение выполняет одиночный или составной оператор:
$i = 1;
while ($i <= 10)
{
print $i;
$i=$i+1;
}
!!! Запомнить конструкцию
Сначала проверяется выражение.
Если $i меньше или равно 10, то выполняется оператор print $i потом изменяем значение переменной, что бы не было безконечного повторения(на русском перебираем значения $i от 1 до 10).
Если $i больше 10, то цикл передает управление следующему за ним оператору.
Важной характеристикой цикла while является то, что оператор никогда не выполнится, если условие изначально было ложно.
Алгоритм:
начало
пока $i<=10 то:
напечатать на экране значение $i;
увеличить $i на 1
конец цикла(пока)
конец.
ВНИМАНИЕ
Часто встречается ошибка, когда условие окончания цикла не удовлетворяется.
Это может происходить потому, что управляющая переменная не изменяется в теле цикла, в результате цикл становится бесконечным.
В таких случаях заметить ошибку довольно легко.
При написании цикла убедитесь, что граничное значение достижимо.
Вместе с оператором цикла часто используется пустой оператор.
В следующем примере происходит увеличение переменной $i значения, большего 10, т. е.
в момент, когда значение переменной станет равной 11, цикл прекратит выполнение:
while ($name++ < 10);
Правила проверки контрольного выражения те же самые, что и для выражений
в операторе if.
Примером цикла может служить копирование нескольких файлов.
Алгоритм выполнения этого задания можно описать так:
Начало
Установить счетчик скопированных файлов на нуль;
скопировать файл;
проверить,закончились файлы или нет:
если нет то увеличить на счетчике количество скопированных файлов и вернуться к началу цикла (опятьскопировать файл),
если да — закончить цикл.
конец
Рассмотрим элементарную программу сложения чисел от 0 до того значения, которое будет задано пользователем.
Имя переменной, которая будет использоваться в программе — $name = 30;
Тогда сам скрипт будет выглядеть следующим образом:
$name = 30;
$my =0;
while ($my < $name)
{
$my++;
echo $my;
}
!!! Запомнить конструкцию
Значение переменной $name = 30; в начале программы задано намеренно, чтобы вы могли сразу реализовать данную программу.
Результатом выполнения данной программы будет число, равное 30.
Иногда в конце конструкции while применяется оператор endwhile.
while(условие):
выражения
endwhile;
Например:
$i = 1;
while ($i <= 10):
print $i;
endwhile;
Этот оператор не обязателен его отсутствие в программе не вызовет никакой ошибки.
Очень Важен используется для выборки из базы данных
Пример: Будет рассмотрет недель через 5 так где то когда доберёмся до работы с базой.
print '<pre>';
while($row=db_fetch($res))
{
print_r($row);
}
!!! Запомнить конструкцию
Конструкция do ... while
DO ... while — это тоже цикл, отличается от while тем, что значение логического выражения проверяется не до, а после окончания работы операторов, включенных в сам цикл. Таким образом, do ... while гарантированно будет выполнен хотя бы один раз, что в случае с while совсем не обязательно. Если условие ложно, управление сразу будет передано дальше.
Например:
$i=5;
$full = 0;
do
{
$full+= $i;
}
while ($i -- >0) ;
print "Итого: $full ";
Рассмотрим два простых цикла и принцип их работы:
$num = 0;
print "счетчик цикла while:
while
($num++ < 10)
{
Print "$num";
}
$num = 0;
Print
"счетчик цикла do: ";
do
{
print "$num";
}
while ($num++ <10);
В результате действия программы на экран будет выведено:
счетчик цикла while: 1 2 3 4 5 6 7 8 9 10
, счетчик цикла do: 0 1 2 3 4 5 6 7 8 9 1 0
Где – - и ++ оперторы увеличение на 1 или уменьшения на 1 соответственно
Равносильно написанию $i=$i+1; или $i=$i-1
Последовательность операторов в теле цикла должна быть выполнена фиксированное число раз.
Но в РНР, как и в С, предусмотрена конструкция, позволяющая делать то же самое более компактно — цикл for.
Оператор FOR тоже очень популярный
Он перебирает значения, проверяет условие и устанавливает начальное
Ниже приведен цикл for, эквивалентный предыдущему циклу while:
for
( начальное_выражение; условие; выражение_управления_циклом)
{
// последовательность операторов.
}
То есть сначала присваивается начальное значение $i=0; или $i=1
Первое выражение начальное_выражение безусловно выполняется.
В начале каждой итерации (проход цикла) вычисляется условие.
Если оно равно true, то цикл продолжается и выполняется вложенный оператор или операторы.
Если оно равно false, то цикл заканчивается.
В конце каждой итерации исполняется выражение_управления_циклом.
Каждое из этих выражений может быть пустым.
Если условие пусто, то цикл продолжается бесконечно (РНР по умолчанию считает его равным true, как и в языке С). Это не так бесполезно, как может показаться, так как зачастую требуется закончить выполнение цикла, используя оператор break (Прервать) в сочетании с логическим условием вместо использования логического выражения в for. Если внутри цикла встречается оператор break, цикл прекращает выполнение итераций и управление передается следующей за циклом команде. Если встречается оператор continue (продолжить), управление передается на начало следующего цикла.
При
выполнении цикла for происходит следующее:
I . Выполняется начальное_выражение. Это происходит только один раз при входе в цикл.
2. Проверяется условие. Если его значение равно true, то осуществляется переход
к третьему пункту. Если же оно ложно, то управление передается оператору, следующему за блоком цикла for. Если это значение изначально было равно false, то операторы в теле цикла не выполняются ни разу.
3. Выполняется последовательность операторов.
4. Вычисляется выражение_управления_циклом.
5. Возврат в пункт 2.
Инструкции начальный оператор, условие и выражение управления циклом ДОЛЖНЫ удовлетворять некоторым условиям. Обязательно должна присутствовать точка с запятой, т. е. корректная следующая запись.
Как несложно догадаться, условие чаще всего используется для проверки условия завершения цикла. Как правило, в нем происходит сравнение переменной управления циклом с некоторым значением.
Инструкция выражения управления циклом обычно используется для приращения счетчика цикла. В данном случае безразлично, использовать ли инкремент в префиксной или же постфиксной форме, поскольку на значение управляющего выражения это никак не влияет.
Рассмотрим следующие примеры. Все они выводят номера с 1 по 10:
Пример 1. Конструкция for (вариант 1)
for ($i = 1; $i <= 10; $i++)
{ print $i;
}
!!! Запомнить конструкцию
Стандарный вариант
Задаём значению и=1 крутимся в цикле до тех пор пока $i не достигнет 10 и увеличиваем значение $i на 1 в конце цикла
Пример 2. Конструкция for (вариант2)
for ($i = 1;;$i++)
{
if ($i > 10)
{
break;
}
print $i;
}
Дыбильный вариант но иногда полезный, крутимся бесконечно прервёмся когда значение будет больше 10
Пример 3. Конструкция for
for ($i = 1; $i <= 10; print $i, $i++) ;
Это вообще что бы Нас запутать… пишут криворукие прогремеры что бы дать понять другим на сколько мы крутые.
Конечно, первый вариант кажется лучшим, но возможность использования пустых выражений в цикле for зачастую является полезной.
РНР также поддерживает альтернативный синтаксис for :
for (exprl; expr2; ехргЗ) : выражение; ...; endfor;
ВНИМАНИЕ
Другие языки программирования используют оператор foreach для того, чтобы обрабатывать массивы или списки. РНР использует для этого оператор while и функции) и each .
Для примера смотрите документацию по этим функциям (на сайте www.php.net).
Зачем нужны циклы? Они используются для перебора массивов, для перебора данных их базы данных, для матрици которые могут 2х или даже 3х мерные. Для рисование линий из аналитической геометрии.
Конструкция foreach
Он призван упростить последовательную обработку всех элементов массива.
Существуют две системы синтаксиса для этого oneратора:
Foreach (array_expression as $value) выражения
Foreach (array_expression as $key => $value) выражения
Руский: звучит так перебирачем масив по элементо.. определимся что нам нужно значение или ключ
$a=Array(1,2,3);
$a[0]=1; 0 = это есть ключ масива 1 значение
Вот определимся что нам нужно значение или ключ если и то и другое используем вариант.
Foreach (array_expression as $key => $value)
{
Тут ваш код
}
!!! Запомнить синтаксис
В первом случае значения переменных массива по очереди присваиваются переменной $value, над которой производятся действия.
В итоге получается своеобразный указатель на то или иное значение переменной из необходимого массива.
Второй способ аналогичен первому, только в этом случае помимо значения переменной будет еще использоваться и ключ, т. е. обозначение этой переменной.
Рассмотрим это на примерах.
Пример Конструкция foreach (вариант 1)
$а = array (1, 2, 3, 17);
foreach ($a as $v)
{
print "Current value of \$a: $v.\n";
}
Результат выполнения программы:
Current value of $a: 1.
Current value of $a: 2.
Current 'value of $a: 3.
Current value of $a: 17.
Ниже приведен аналогичный пример, только обратите внимание, что индекс массива всегда постоянный и равный 0. А значения передаваемой переменной изменяются. Это очень важно.
Конструкция f oreach (вариант 2)
$а = array (1, 2, 3, 17) ;
$i = 0; /* для более подробного анализа*/
f oreach ($a as $v)
{
print "\$a[$i] => $v.\n";
}
Результат этой программы:
$a[0] => 1.
$a[0] => 2.
$a[0] => 3.
$a[0] => 17.
В следующем примере показана работа оператора f oreach на основании массива
значений. Помимо этих значений каждая переменная имеет свой собственный
ключ.
Пример 13.7. Конструкция foreach (вариант 3)
$а = array ("one" => 1,"two" => 2,"three" => 3,"seventeen" => 17);
foreach ($a as $k
=> $v)
{
print
"\$a[$k] =^> $v.\n";
}
!!! Запомнить конструкцию foreach
После выполнения этой программы на экран будет выведено;
$a[one] => l
$a[two] => 2.
$а[ three] => 3.
$а [seventeen] => 17.
Думаем, на основании этих примеров вы смогли получить подробное описание
работы данного оператора. Посмотрим, почему его использование намного удобнее, чем цикла while:
reset ($arr) ;
while (list(, $value) = each ($arr) )
{
echo "Value: $value<br>\n";
foreach($arr as $value) {
echo "Value: $value<br>\n";
}
reset ($arr) ;
while (list($key, $value) = each ($arr) ) {
echo "Key: $key; Value: $value<br>\n";
}
foreach($arr as $key => $value) {
echo "Key: $key; Value: $value<br>\n";
Как видно из примеров, использование цикла while в этом случае намного сложнее для понимания, к тому же необходимо применение еще одной функции
resetQ.
ВНИМАНИЕ
Перед началом выполнения foreach внутренний указатель массива автоматически возвращается на первый элемент. Это означает, что вы не должны повторно вызывать функцию resetO перед циклом foreach.
Также заметьте, что foreach работает с копией указанного массива, поэтому указатель не изменяется с каждой конструкцией.
Рассмотрим пример, в котором число с плавающей запятой требуется округлить до
определенного разряда. Проблема связана с теми же погрешностями представления, которые затрудняют сравнение чисел, а также возникает в ситуациях, когда
точность ответа намеренно снижается для получения более наглядного результата :
$а[0]=4.3;
$а[1]=4.5;
$а[2]=4.7;
$а[3]=-4.3;
Print "0кругляем с помощью round<br>\n";
foreach ($a as $b)
{
$с = round ($b) ;
print " $c <br>\n ";
}
Print “0кругляем с помощью floor <br>\n";
foreach ($a as $b)
{
$c = floor ($b) ;
print " $c <br>\n ";
}
Print "0кpyгляeм с помощью ceil <br>\n";
foreach ($a as $b)
{
$c = ceil ($b) ;
print " $c <br>\n ";
}
Исходные значения:
$a[0]=4.3;
$a[l]=4.5;
$a[2]=4.7;
$a[3]=-4.3;
Результат будет следующий:
Округляем с помощью round
4
5
5
-4
Округляем с помощью floor
4.0
4.0
4.0
-5.0
Округляем с помощью ceil
5.0
5.0
5.0
-4.0
Округление серьезно отражается на работе некоторых алгоритмов, потому используемый метод должен быть точно указан. В особо важных приложениях (например,в финансовых вычислениях или системах наведения ракет) грамотный программист реализует свою собственную функцию, не полагаясь на встроенную логику языка (или ее отсутствие).
В РНР существуют следующие функции, предназначенные для округления чисел
с плавающей запятой до целых: round ( ) , ceil () и floor ( ) . Встроенная функция
round () возвращает целую часть числа с плавающей запятой. Функция floor ()
и ceil () округляет аргументы в большую или меньшую стороны, соответственно,
до ближайшего целого.
Операторы перехода
Операторы перехода (jump statements) осуществляют безусловную передачу управ-
ления в определенное место программы. Мы рассмотрим следующие операторы
перехода:
• break,
• continue.
Оператор break
Например, использование оператора break в цикле while:
$arr = array ('один', 'два', 'три', 'четыре', 'стоп', 'пять');
while (list (, $val) = each ($arr) )
{
if ($val == 'стоп')
{
break ; /* в этой строчке вместо break можно использовать break */
}
echo "$val<br>\n";
}
Выполнение этой программы будет осуществляться до тех пор, пока значение переменной не станет равной стоп. После этого программа прерывается оператором break. В результате на экран браузера будет выведено:
один
два
три
четыре
Если бы оператора break не было, то к этим фразам бы добавилось еще две:
стоп
При употреблении break можно также вместо него пользоваться таким синтакси-
ческим обозначением break 1 — результат работы программы будет аналогичным.
Рассмотрим еще один пример:
$1 = 0;
while (++$i)
{
switch ($i)
{
case 5:
echo "Программа прервалась на 5 <br>\n";
break 1;
case 10:
echo "Программа прервалась на 10, и произошла остановка выполнения. <br>\n";
break 2;
default:
break;
Переменная $i в в рассмотренной программе будет постепенно увеличивать.
Как только значение ее станет равным 5, она автоматически по ссылке попадет на оператор case 5:, далее произойдет выполнения выражение echo "Программа прервалась на 5 <br>\n";, что приведет к выводу строчки "Программа прервалась на 5", хотя, именно в этот момент программа еще не завершилась (это произойдет,как только выполнится оператор break 1;).
Но даже в этом случае произойдет выход только из конструкции switch, но не из цикла. Дальше прибавляется по единице к имеющейся пятерке. Как только значение переменной станет равно 10,
выполнится оператор break 2, за счет чего произойдет выход из оператора switch и из самого цикла while.
Оператор continue
Оператор continue прекращает текущую итерацию в ближайшем внешнем цикле while, do или for. Управление передается проверочному выражению циклов while и do или выражению управления циклом в цикле for.
Оператор continue (вариант 1)
while (list ($key, $value) = each ($arr) )
{
if (! ($key % 2 ) )
{ // пропуск нечетных значений
continue;
do_something_odd ($value) ;
}
}
Оператор возврата return
Оператор возврата return передает управление программой вызывающей функции. Обычно оператор return возвращает значение некоторого выражения, которое становится значением функции. Пустая функция — это функция, не возвращающая никакое значение. В этом случае с оператором return не связывается никакое выражение.
Например:
return 1; // функция возвращает целое число
return $z/$e; // возвращает $z/$e
return; // пустая функция не возвращает значение
Оператор return может располагаться в
любом месте функции.
Задача: зайти на php.net и ознакомится с фунциями и попробовать разобратся с примерами чужих авторов в коментариях
While; forech, rand,floor,list,break, continue.
Задача этой лекции понять синтаксис цикла, разобратся: как сделать повторение операций, разобраться как можно перебрать элементы массива, как можно прервать масив, как можно
взять следующее повторение.
Далее будем пробовать писать алгоритмы.
Пока ещё на бумаге.. рано еще к компу бросаться... но мы уже близко..
Всем спасиб.
Комментарии: Добавить комментарий
Пока нет комментариев.
Добавьте ваш комментарий:
Чтобы оставить комментарий вам нужно войти на сайт или зарегистрироваться.