Уроки PHP. Урок2. Конструкции для организации циклов в PHP

Как правило, все примеры практического применения для языка программирования должны иметь какой-то смысл. В конце концов, вы тратите свое время и должны получить от этого какой-то результат. Пускай он будет минимален, и будет состоять лишь в ускорении неких рутинных процессов. В любом случае, — практический смысл при обучении значение, чем. Именно на этом будет построено описание конструкций языка PHP.

Задача, — Рассчитать общий размер файлов в текущем каталоге и вывести список файлов

PHP весь построен на том, что называется — избыточной функциональностью. То есть, чтобы получить некий результат, можно всегда пойти двумя путями, — создавать «с нуля» свое решение, или воспользоваться готовым, которое уже построено, например, в виде функции. Кстати, за такой неочевидный подход к разработке языка, создателей PHP — очень часто ругают!

Для того, чтобы понять, что это означает на практике, можно попробовать решить простую задачу. Например, представьте, что вам необходимо срочно подсчитать количество файлов и их размер в текущей директории. Поскольку скрипт будет располагаться в директории с примерами, то вы фактически узнаете объем PHP кода, который вы написали от руки. Сразу оговорюсь, для начала  несколько ограничим задачу, будем считать файлы и их размер, только в указанной директории, без «захода» в подкаталоги. С таким заходом, обычно необходимо использовать решение, известное под названием рекурсия, и оно часто пугает даже обучавшихся программированию людей.

Для начала я предложу вам решение, которое использует стандартную функцию языка, а потом рассмотрим более общее, — так сказать расширенное решение. Таким образом вы сможете увидеть чем отличается функциональный подход, от обычного решения задачи.

Функциональное решение задачи
lesson_02_01.php

<?php

foreach( glob( «./*.*» )as $f )

{

echo $f . «\n»;

}

$total = 0;

foreach( glob( «./*.*» )as $f )

{

$total = $total + filesize($f);

}

echo «Total Size: $total Bytes. \n»;

 

Алгоритмическое решение задачи
lesson_02_02.php

<?php

$total = 0;

$d = opendir( «.» );

while ( $f = readdir( $d )  )

{

if ( $f == «.» || $f == «..»  )

{

continue;

}

$total = $total + filesize($f);

echo $f . «\n» ;

}

echo «Total Size: $total Bytes. \n»;

closedir( $d );

 

Итак, в данном элементарном примере показаны сразу несколько конструкций. Во-первых, отметим оформление скриптов PHP. Весь код PHP должен начинаться с открывающего тега. Не имеет значения, в каком контексте запускается ваш скрипт — локально или на веб-сервере. В общем случае открывающий тег может быть указан как «<?php» или просто как «<?». И в подавляющем большинстве случаев, «<?» будет отлично работать. Однако, следует помнить, что эта возможность в PHP конфигурируется. То есть — никогда нельзя быть уверенным, что на сервере, где может быть гипотетически запущен ваш скрипт, конфигурация не ужесточена использованием более длинного  варианта открываюшей конструкции.

Именно поэтому лучше сразу приучиться писать открывающий тег полностью, а именно «<?php». Могу сказать, что в своей практике я неоднократно сталкивался с ситуациями, когда сервер работал только с такими тегами, и изменить конфигурацию было попросту невозможно.

Цикл foreach

Функциональное решение задачи вывода спска файлов основано на обращении к функции glob() которая фактически отдает массив с именами файлов, которые соответствуют определенной маске. Более подробно про данную функцию можно почитать на странице php.net/glob. На самом деле данная функция может отдавать не только список файлов, но и — директорий, а также выполнять некоторые другие действия при этом.

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

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

Фактически в функциональном решении использована способность функции glob  выдавать список всех файлов, далее результат работы функции передан в конструкцию foreach(Arr as Elem){} которая выполняет действие в операторных скобках то количество раз, сколько встречается элементов в переданном конструкции массиве.

В алгоритмическом решении используется пара функций opendir() и readdir() — для открытия и чтения текущей директории. Аналогично, функциональному, в данном примере использован цикл, но уже другого вида while( A ){}. В отличие от предыдущего типа, привязанного к сложному типу данных, вроде массива, эта конструкция выполняется  до тех пор, пока условие A — истинно.  Кроме того, в данном примере подсчет общего размера файлов происходит в том же цикле.

Оптимизированное решение
lesson_02_03.php

Обратите внимание, что приведенные выше два примера не являются оптимизированными, например, вполне нормально уменьшить размер используемого кода, до такого размера, как в следующем коде:

<?php

$total = 0;

foreach ( glob(«*.*») as $f  )

{

echo «$f\n»;

$total += filesize($f);

}

echo «Total Size: $total Bytes. \n»;

 

Обратите внимание на используемые в коде операции echo «$f\n» и «+=». Первая запись — это внедрение переменной $f в текст строки. PHP позволяет делать это, и это удобно, однако следует помнить что в общем случае очень тяжело понять как работает вот такой код — echo»$f_$z\n». Поэтому желательно либо внедрять переменные в строки, лишь там, где вы можете разделить вывод пробелами, либо использовать такую вот запись echo»{$f}_{$z}\n». В таком случае интерпретатор выведет не значение переменное $f_ а уже $f. Я уже не говорю про то, что, скорее всего вы получите ошибку, так как хотели добиться другого результата.

 

В данных примерах применены также операции объединения строк, например,  код — echo $f . «\n»  — объединяет переменную $f и символ перевода строки, после чего передает это дело в консоль. Существует целый ряд операций, которые можно выполнять со строками, однако  следует помнить, что в общем случае переменные в PHP не имеют четкого типа, поэтому такие операции как $f+$f также разрешены. Правда, в отличие от объединения строк, данная запись — сложить числовые значения строк. И скорее всего вы получите неожиданный результат.

 

Вот и все что качается простейших задач в цикле. После прочтения данного раздела рекомендуется изменить примеры таким образом, чтобы имена файлов выводились в порядке возрастания их размера. Такой пример можно сделать, использовал промежуточный массив и его сортировку. Как происходят операции с массивами, вы можете почитать в документации по PHP, здесь — php.net/array.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *