• strict warning: Non-static method view::load() should not be called statically in /var/www/codeacademy/sites/all/modules/views/views.module on line 1113.
  • strict warning: Declaration of views_handler_field::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_field.inc on line 0.
  • strict warning: Declaration of content_handler_field::element_type() should be compatible with views_handler_field::element_type($none_supported = false, $default_empty = false, $inline = false) in /var/www/codeacademy/sites/all/modules/cck/includes/views/handlers/content_handler_field.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_query.inc on line 0.
  • strict warning: Declaration of views_plugin_style_default::options() should be compatible with views_object::options() in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_row.inc on line 0.

Обработка данных в php. Циклы.

Простой пример. У нас есть показатели температур какого-нибудь населенного пункта за пять дней. Нужно вычислить среднюю температуру и вывести ее на экран. Для этого достаточно будет написать несложный код:

<?php
  $t = $t1 + $t2 + $t3 + $t4 + $t5;
  $result = $t/5;
  echo "Средняя температура  " . $result;
?>

Но как быть, если необходимо будет вычислить среднюю температуру за год? Или за 10 лет? Не будем же мы до умопомрачения писать код, который будет складывать сотни переменных? Или, например, потребуется сформировать картотеку жителей города и отсортировать ее в алфавитном порядке или по возрастным ограничениям? На службу приходят циклы.

Цикл for

С помощью цикла можно "заставить" кусок кода повторяться сколь угодно раз. Самая простая и часто используемая конструкция в циклах представлена оператором for:

<?php
for ( $i = 1; $i <= 10; $i++ ) {
    echo "i равно " . $i . "<br />";
}
echo "Мы вышли из цикла!";
?>

Если запустить этот код, то на экране вы увидите столбик из чисел от 1 до 10. Прекрасно! Мы использовали только один оператор echo, который сработал 10 раз!

Синтаксис управляющей конструкции for достаточно прост. Для него необходима переменная, которой присваивается начальное значение ( у нас это $i = 1), затем указывается условие, при котором программа выйдет из цикла ( в нашем случае код будет повторяться, пока $i будет меньше или равно 10). Последнее выражение в скобках указывает, на какую величину будет увеличиваться переменная при каждом следующем повторении (в нашем примере написано $i++, т.е. $i будет увеличиваться на единицу).

Обратите внимание, что тело цикла заключено в фигурные скобки. Ошибкой новичка, как правило, является "забывчивость" по отношению к последней, закрывающей скобке. Поэтому приучите себя сначала набирать на клавиатуре обе скобки, а затем внутрь них помещать само тело цикла.

Собственно, ничего сложного. Чтобы убедиться в универсальности этой конструкции можете запустить такой код:

<?php
for  ( $index  = 1000; $index >= 0; $index = $index – 100 ) {
    echo $index."<br />";
}
?>

В браузере выведется столбик чисел, начиная с 1000 и заканчивая "0" с интервалом 100.

Итак, вернемся к средней температуре загадочного населенного пункта! В реальной жизни обычно все данные содержатся в файле или какой-нибудь электронной Базе Данных. С такими важными вещами мы познакомимся в следующей статье, а пока что нам на помощь придут массивы, в которых мы будем хранить необходимую информацию.

Создадим массив $temp из 365 элементов, который будут содержать случайные числа от -10 до 36. Это и будет наша база данных температур загадочного городка за год. В конце-концов определим среднюю температуру за этот период.

Файл index.php:

Итак, в первом цикле мы заполняем массив $temp случайными числами с помощь функции rand, аргументами которой являются нижняя и верхняя граница необходимого диапазона. В связи с тем, что генератор случайных чисел дает числа с плавающей запятой, мы превращаем эти числа в целые – функция intval. В теле первого цикла мы сразу же и выводим эти значения на экран через точку с запятой.

Перед вторым циклом объявляется переменная $sum, в которой будут накапливаться все значения массива. Естественно, мы ее изначально обнуляем.

В теле второго цикла ничего сложного не происходит – каждый следующий элемент массива складывается с общей суммой. После завершения цикла вся сумма делится на 365 и выводится на экран.

Цикл foreach

Наиболее часто циклы используются для обработки ассоциативных массивов. В таких случаях используется более удобная конструкция foreach, которая пробегает все элементы массива, разделяя их на ключ и значение. Приведем пример, наглядно это иллюстрирующий.

Задача. Есть массив из 4-х участников спортивной секции с фамилиями и возрастом. Необходимо вывести на экран фамилию спортсмена и его возраст, а так же подсчитать средний возраст всей этой группы.

Файл index.php:

Слово foreach происходит от английского выражения for each, что в переводе означает для каждого. Так вот и в нашем случае для каждого элемента массива при каждой итерации появляется переменная $name, в которую заносится ключ массива (фамилия), и $age, которой присваивается значение данного ключа (возраст). После вывода на экран, к переменной $sum каждый раз прибавляется следующее и следующее значение возраста спортсмена. Последняя строчка вам уже известна из предыдущего примера.

Цикл while

Заполним массив с температурами с помощью конструкции while:

<?php
    $i = 0;
    while ($i < 365) {
        $temp[$i] = intval(rand(-10,36));
        echo $temp[$i]."; ";
        $i ++;
    };
?>

В этом случае сначала объявляется переменная, которая будет счетчиком ($i=0), а затем цикл while начинает свою работу. Значение переменной $i изменяется искусственно непосредственно в теле цикла. Как видите, в данном примере намного удобнее использовать конструкцию for, однако это не означает, что while совсем бесполезный оператор. Например, при работе с файлами без него просто не обойтись!

Волшебный оператор break

Бывают случаи, когда программа должна остановить цикл в каком-то определенном случае и выйти из него. Для этого используется оператор break.

Пример. Выводим случайные числа от 1 до 100. Если попадется число меньше 10-ти – останавливаем генератор с выходом из цикла.

<?php
    for( $i = 0; $i < 365; $i++){
        $number = intval ( rand(1,100) );
        if ( $number < 10 ) break;
        echo $number."; ";
    }
    echo "Выполнение продолжается";
?>

Оператор break можно использовать во всех типах циклических конструкций.

Волшебный оператор continue

Оператор continue останавливает текущую итерацию цикла и переходит к следующей. Допустим, в первом примере с температурой поставили новое условие – заполнять массив только положительными значениями температур. Код будет таким:

<?php
$temp = array();
    for( $i = 0; $i < 365; $i++ ){
        $tmp = intval ( rand( -10,36 ) );
        if ( $tmp < 0 ) continue;
        $temp[$i] =  $tmp; 
        echo $temp[$i]."; ";
    }    
?>

Как видите, сначала берется очередное случайное число. Затем идет проверка – если значение меньше нуля, работа внутри цикла прекращается и цикл делает следующую итерацию (при этом $i увеличивается на 1). В данном примере не будут заполнены все элементы массива - элементы, которые не получили своего значения, будут попросту отсутствовать.

Что ж, теперь у вас готова теоретическая база по циклам и можно приступать к освоению более сложных уроков.