13.16. Конструкция foreach в PHP
Данный оператор цикла является новым и используется только в РНР4. Аналогичный оператор можно найти в Perl. Он призван упростить последовательную обработку всех элементов массива. Существуют две системы синтаксиса для этого оператора:
foreach (array_expression as $value) выражения
foreach (array_expression as $key => $value) выражения
В первом случае значения переменных массива по очереди присваиваются переменной $value, над которой производятся действия. В итоге получается своеобразный указатель на то или иное значение переменной из необходимого массива.
Второй способ аналогичен первому, только в этом случае помимо значения пере: менной будет еще использоваться и ключ, т. е. обозначение этой переменной. Рассмотрим это на примерах.
Пример 13.5. Конструкция 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. А значения передаваемой переменной изменяются. Это очень важно.
Пример 13.6. Конструкция foreach (вариант 2)
$а = array (1, 2, 3, 17);
$i = 0; /* для более подробного анализа*/
foreach($а as $v) {
print "$a[$i] => $v.n";
}
Результат этой программы:
$a[0] => 1.
$a[0] => 2.
$a[0] => 3.
$a[0] => 17.
В следующем примере показана работа оператора foreach на основании массива значений. Помимо этих значений каждая переменная имеет свой собственный ключ.
Пример 13.7. Конструкция foreach (вариант 3)
$а = array (
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach($a as $k => $v) {
print "$a[$k] $v.n";
}
После выполнения этой программы на экран будет выведено;
$a[one] => 1.
$a[two] => 2.
$а[three] => 3.
$a[seventeen] => 17.
Думаем, на основании этих примеров вы смогли получить подробное описание работы данного оператора. Посмотрим, почему его использование намного удобнее, чем цикла while:
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>n";
}
foreach ($arr as $value) {
echo "Value: $value<br>n";
}
Это в случае второй конструкции (пример 13.6). А вот при использовании ключей (пример 13.7):
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 в этом случае намного сложнее для понимания, к тому же необходимо применение еще одной функции — reset().
ВНИМАНИЕ
Перед началом выполнения foreach внутренний указатель массива автоматически возвращается на первый элемент. Это означает, что вы не должны повторно вызывать функцию reset() перед циклом foreach.
Также заметьте, что foreach работает с копией указанного массива, поэтому указатель не изменяется с каждой конструкцией.
Рассмотрим пример, в котором число с плавающей запятой требуется округлить до определенного разряда. Проблема связана с теми же погрешностями представления, которые затрудняют сравнение чисел, а также возникает в ситуациях, когда точность ответа намеренно снижается для получения более наглядного результата:
<?
$а[0]=4.3;
$а[1]=4.5;
$а[2]=4.7;
$а[3]=-4.3;
print "Округляем с помощью round<br>n";
foreach ($а as $b) {
$с = round($b);
print " $c <br>n ";
}
print "Округляем с помощью floor <br>n";
foreach ($a as $b) {
$c = floor ($b) ;
print " $c <br>n ";
}
print "Округляем с помощью ceil <br>n";
foreach($a as $b) {
$c = ceil($b);
print " $c <br>n ";
}
?>
Исходные значения:
$a[0]=4.3;
$a[1]=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() округляет аргументы в большую или меньшую стороны, соответственно, до ближайшего целого.