Управляващи структури (Част 2)

Цикъл while

Циклите се включват в скрипта, когато е възникнала необходимост от многократно изпълнение на код. Цикълът while изпълнява съответния блок оператори до момента, до който зададеното условие е истина. При всяка итерация той проверява условието. Когато условието стане FALSE, цикълът се прекратява. Синтаксисът е следния:

while (условие) {
        инструкция/и;
}
  1. Отворете текстовия редактор и създайте нов документ. Дайте му наименование select.php.
  2. <!Doctype html>
    <html>
    <head>
    <title>Меню Select</title>
    <meta http-equiv="Content-Type" content="text/html"; 
    charset="UTF-8">
    </head>
    <body> 
    
  3. Задаваме текущата година с помощта на функцията date().
    <?php 
     $year = date ("Y"); 
     echo  date ("Y") . " ". "година"."</br>";
     echo "Директорията, в която се намира файлът е:" ." ".
     htmlspecialchars($_SERVER["PHP_SELF"]);
    ?>
    
    Функцията date("Y") ще върне текущата година. За променливата $_SERVER["PHP_SELF"] ще говорим по-нататък.

  4. Ще създадем HTML форма, която ще съдържа падащо меню с месеците:
    <form action= '<?php echo 
            htmlspecialchars($_SERVER["PHP_SELF"]);?>'>
     <p style="color: red;">Изберете месец:<p>
    <form action= '<?php echo 
            htmlspecialchars($_SERVER["PHP_SELF"]);?>'
            metod= "POST"  name= "Month">
    <select name="Month">
     <option value="Select month">Изберете месец</option>\n 
     <option value="January">Януари</option>\n> 
     <option value="February">Февруари</option>\n> 
     <option value="March">Март</option>\n> 
     <option value="April">Април</option>\n> 
     <option value="May">Май</option>\n> 
     <option value="June">Юни</option>\n> 
     <option value="July">Юли</option>\n> 
     <option value="August">Август</option>\n> 
     <option value="September">Септември</option>\n> 
     <option value="October">Октомври</option>\n> 
     <option value="November">Ноември</option>\n> 
     <option value="December">Декември</option>\n>
    </select>
    </form>
    
  5. С помощта на цикъла while ще създадем падащо меню с дните.
    <p style="color: red;">Изберете ден:<p>
    <form action= '<?php echo 
    htmlspecialchars($_SERVER["PHP_SELF"]);?>' 
    metod="POST"  name="Day"> 
    <select name=”Day”>
     <option value="Day">Изберете ден</option>\n>
    <?php
            $day = 1;
            while($day <= 31)
               {
                echo '<option value='.$day.'>'.$day.'</option>';
                      $day++;  
               }
    ?>
    </select>
    </form>
    
    Задаваме на променливата $day стойност 1. Това трябва да се направи преди началото на цикъла. След това автоманично ще се направи проверка дали променливата $day е равна на 31 или не е. Ако е така, стойността на променливата $day ще се напечата като опция в менюто на дните, а след това стойността й ще се увеличи с 1. Този процес ще продължава, докато стойността не стане 32. В този момент цикълът ще прекрати и ще започне изпълнението на следващата инструкция (ако има такава).

  6. С помощта на друг цикъл while ще създадем падащо меню с годините.
    <p style="color: red;">Изберете година:<p>
    <form action= '<?php echo 
    htmlspecialchars($_SERVER["PHP_SELF"]);?>' 
    metod="POST"  name="Years"> 
    <select name=”Years>
     <option value="Year">Изберете година</option>\n>
    <?php
            $EndYear = $year + 10;
            while($year <= $EndYear)
               {
                echo '<option value='.$year.'>'.$year.'</option>';
                      $year++;  
               }
    ?>
    </select>
    </form>
    
    В падащото меню ще се генерират текущата година и следващите десет години, защото $EndYear = $year + 10;.

  7. Желателно е да създадете бутон Submit.
    </br><input type=submit name=Submit value = "Напред!"> 
    </form>
    </body>
    </html>
    
  8. Съхранете файла, качете го на сървъра и тествайте в браузъра.
select_php.png

Какво представлява променливата $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] е променлива, която връща като стойност името и мястото от където се изпълнява текущия файл (от root папката на документите). Тази променлива може да бъде използвана от хакерите. Те могат да поставят наклонена черта в адресното поле на браузъра и да вмъкнат някакъв изпълним код.
Например:

<script>alert('Now I\'m in no laughing mood!')</script>

Тогава в браузъра ще видите:

select_php_1.png

Функциите htmlentities() и htmlspecialchars() конвертират всички знаци в HTML.

select_php_2.png

Скриптът не се изпълнява. Обикновено сървърите са настроени автоматично да правят това конвертиране, но защо да поемаме този риск.

Може и така:

<!--select1.html -->
<!Doctype html>
<html>
<head>
<title>Меню Select</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>
 
<form action= 'select1_handle.php' method='post'>
<fieldset style="width:200px;">
<legend >Изберете:</legend>
<p style='color: red;'>Изберете месец:<p>
 
 <select name='Month'>
 <option value='' selected="selected"></option>\n 
 <option value='Януари'>Януари</option>\n> 
 <option value='Февруари'>Февруари</option>\n> 
 <option  value='Март'>Март</option>\n> 
 <option  value='Април'>Април</option>\n> 
 <option  value='Май'>Май</option>\n> 
 <option  value='Юни'>Юни</option>\n> 
 <option  value='Юли'>Юли</option>\n> 
 <option  value='Август'>Август</option>\n> 
 <option  value='Септември'>Септември</option>\n> 
 <option  value='Октомври'>Октомври</option>\n> 
 <option  value='Ноември'>Ноември</option>\n> 
 <option  value='Декември'>Декември</option>\n>
 </select>
 
 <p style='color: red;'>Изберете ден:<p>
 <input type="number" name="day" min="1" max="31">
 <p style='color: red;'>Изберете година:<p>
 <input type="number" name="year" min="2016" max="2026">
</fieldset>


</br><input type=submit name=submit value = "Продължи" 
style="margin-right:20px;margin-left:5px;">
<button type="reset" value="reset">Изчисти</button> 
</form>

</body>
</html>
<!--select1_handle.php-->
<!Doctype html>
<html>
<head>
<title>Меню Select</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>
<?php
//Обработва данните от select1.html

if(isset($_POST["submit"], $_POST["Month"], $_POST["day"], 
$_POST["year"])){
$Month= $_POST["Month"];
$day= $_POST["day"];
$year= $_POST["year"];
 
echo "Избраният месец е:" . " "  . $Month . "<br>";
echo "Избраният ден е:" . " "  . $day . "<br>";
echo "Избраната година е:" . " "  . $year . "<br><br>";

}

?>
</body>
</html>
select1.png

select1_handle.png

Цикъл do … while

Цикълът do … while е подобен на цикъла while, като разликата е, че при do … while условието се проверява след първата итерация, а при while- в началото на първата итерация.
Синтаксисът е:

do{
инструкция/инструкции;
}
while (условие);

Цикъл for

Цикълът for е предназначен за изпълнение на блок от инструкции определен брой пъти (за разлика от while, който се изпълнява докато условието стане FALSE). За да се осъществи това, в цикъла се използват специални променливи (броячи на цикъла).
Синтаксисът на цикъла for е следния:

for (начална стойност; условие; краен израз) {
      блок от команди на цикъла;
}

При инициализация на цикъла, началната стойност ще се изпълни веднъж. След това се проверява условието (в началото на всяка итерация) и, ако то е истина, цикълът продължава изпълнението на командите, вложени в него, ако условието е лъжа, изпълнението на цикъла се прекратява. Крайният израз (нарича се още брояч на цикъла), се изпълнява всеки път, когато условието бъде определено като истина. но само след обработка на всички инструкции от блока на цикъла. Ако условие липсва, тогава цикълът ще се изпълнява безкрайно и при необходимост може да се прекрати с командата break (може да се използва за прекъсване на циклите for, foreach, while, do-while или switch).
Например:

<?php
for ($day = 1; $day <= 31; $day++) {
 echo '<option value='.$day.'>'.$day.'</option>';
                  $day=$day + 1;
}
?>

В началото се присвоява стойност на променливата $day=1. След това се задава условието ($day <= 31). Ако върната стойност е истина, се изпълнява инструкцията echo и стойността на променливата $day се увеличава с 1. В края на всяка итерация стойността на променливата $day се увеличава с отново с 1. Можете да си създадете .php файл, който да съдържа горенаписания скрипт. След изпълнението на скрипта, в браузъра ще видите:

for_php.png

Най-разпространеният пример за цикъла for е да се изпечатат всички прости числа (които се делят само на себе си и на 1) от 1 до n (Решето на Ератостен).

История

Доказано е, че простите числа за пръв път са изучавани задълбочено от древните гърци (например Евклид). Гъркът Ератостен е създал метод за намиране на всички прости числа по-малки от дадено положително число. Неговият изненадващо ефикасен метод е много добър старт за по-нататъшното развитие на теорията на числата. При своя метод (Решето на Ератостен) той започва като написва всички числа от 2 до зададеното число. След това той зачерква всички числа, делящи се на 2, след това тези делящи се на 3 и така нататък докато зачеркне всички възможни числа. Няма да му отнеме време да зачерква числата делящи се на 4, защото те се делят и на 2. С други думи той зачерква само числата делящи се на тези прости числа, които не са по-големи от квадратен корен от числото посочено като горна граница на търсенето. Например за да намери простите числа по-малки от 100 той би зачеркнал само тези, които се делят на прости числа по-малки от 10 (квадратен корен от 100). Тогава незачеркнатите числа са прости числа.
  1. Създайте нов документ в текстовия редактор. Дайте му наименование prime_numbers.php.
  2. Въведете:
    <!Doctype html>
    <html>
    <head>
    <title>Цикълът For</title>
    <meta http-equiv="Content-Type" content="text/html"; 
    charset="UTF-8">
    </head>
    <body>
    <?php
    
    ?>
    </body>
    </html>
    
  3. Дайте начало на цикъла for:

    for ($х = 2; $x <= 100; $x++) {

    Първоначално задаваме стойност 1 на променливата $x. След това проверяваме стойността на променливата дали е по-малка или равна на 100. С други думи, цикълът се изпълнява 100 пъти. Ако условието е истина, се изпълняват командите в блока и стойността на променливата $x се увеличава с 1. Процесът на проверка започва отново.
    Кои са блоковите инструкции, т.е. какво съдържа тялото на цикъла?

    if ( ($x == 2) OR ($x == 3) OR ($x == 5) OR ($x == 7 ) ) {
      echo "$x</br>";
    } 
     elseif (($x % 2 != 0) AND ($x % 3 != 0) AND
                    ($x % 5 != 0) AND ($x % 7 != 0)) {
       echo "$x</br>" ;
    }
    }
    

    Както вече казахме, прости са тези числа, които се делят единствено и само на себе си и на 1. Тогава, ако разделим това число на някое друго число, то винаги операцията деление ще се извършва с остатък. 4 не е просто число, защото се дели на 2 без остатък. 7 е просто число, защото се дели на 2, 3, 4 с остатък. Всички знаем, че 2, 3, 5 и 7 са прости числа, поради което, ако стойността на променливата $x е равна на едно от тях, тя ще се изведе веднага на екрана. Използваме оператора OR, така че, ако едно от условията е вярно, стойността на променливата ще се изведе на екрана.

    Ако стойността на променливата не е 2, 3, 5 или 7, за да определим дали числото е просто, трябва да го проверим. Делим числото на 2, 3, 5 и 7 и проверяваме дали има остатък от деленето. За да извършим това, ни е необходим оператора остатък от целочислено деление (%). Ако след извършване на операцията деление на променливата $x с 2,3, 5 и 7, остатъкът не е 0, то пред нас най-вероятно стои просто число, чиято стойност се извежда на екрана. Тук оператора, с който работим е AND, т.е. необходимо е и при трите деления остатъкът да е число, различно от 0, в противен случай числото не е просто.

  4. Съхранете файла, качете го на сървъра и тествайте в браузъра.
prime_numbers.png
Съществуват много случаи в които можете да работите както с цикъла for, така и с цикъла while. Цикълът while често се прилага за извличане на данни от бази данни, докато for - при работа с масиви.

Цикъл foreach


Цикълът foreach работи само с масиви и обекти (след PHP5).
Синтаксисът му е:

foreach ($array as $value){
 инструкция/инструкции
}
или
foreach ($array as $key => $value){
 инструкция/инструкции
}

Как работи цикълът?
Взема елемент от масива $array и съхранява стойността му в променливата $value, при което вътрешния указател на масива се придвижва напред с една позиция, за да може при следващата итерация да се вземе следващия елемент, изпълнява се инструкцията/те и следва нова итерация. При втория начин на изписване, се взема ключа на променливата и той се присвоява на променливата $key.

sign.png

Няма коментари:

Публикуване на коментар