For 循环是 PHP 中最常用的循环结构之一,特别适用于已知循环次数的场景。它提供了简洁的语法来初始化变量、设置条件和更新变量。
PHP 提供了多种循环结构来处理重复性任务,每种循环都有其特定的使用场景:
选择循环类型的建议:
For 循环用于在预先知道脚本需要运行次数的情况。它将循环控制集中在一行代码中,使得代码更加简洁和易读。
for (初始值; 条件; 增量) {
// 要执行的代码
}
<?php
for ($i = 1; $i <= 5; $i++) {
echo "数字是: " . $i . "<br>";
}
?>
数字是: 1 数字是: 2 数字是: 3 数字是: 4 数字是: 5
<?php
echo "<table border='1'>";
echo "<tr><th>数字</th><th>平方</th><th>立方</th></tr>";
for ($i = 1; $i <= 5; $i++) {
$square = $i * $i;
$cube = $i * $i * $i;
echo "<tr>";
echo "<td>$i</td>";
echo "<td>$square</td>";
echo "<td>$cube</td>";
echo "</tr>";
}
echo "</table>";
?>
<?php
// 初始化多个变量
for ($i = 0, $j = 10; $i < 5; $i++, $j--) {
echo "i = $i, j = $j<br>";
}
?>
i = 0, j = 10 i = 1, j = 9 i = 2, j = 8 i = 3, j = 7 i = 4, j = 6
<?php
// 省略初始化表达式
$i = 1;
for (; $i <= 3; $i++) {
echo "数字: $i<br>";
}
echo "<br>";
// 省略增量表达式
for ($j = 1; $j <= 3;) {
echo "数字: $j<br>";
$j++; // 在循环体内更新
}
?>
<?php
// 无限循环(实际使用时需要退出条件)
for (;;) {
// 需要 break 语句来退出
break; // 这里立即退出,避免真正无限循环
}
// 带退出条件的无限循环
$counter = 0;
for (;;) {
$counter++;
echo "循环执行: $counter<br>";
if ($counter >= 3) {
break;
}
}
?>
Foreach 循环是专门为遍历数组和对象设计的循环结构,它提供了简洁的语法来访问数组的每个元素。
// 只获取值
foreach ($array as $value) {
// 使用 $value
}
// 获取键和值
foreach ($array as $key => $value) {
// 使用 $key 和 $value
}
<?php
// 索引数组
$colors = array("red", "green", "blue");
foreach ($colors as $color) {
echo "颜色: $color<br>";
}
echo "<br>";
// 关联数组
$age = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
foreach ($age as $name => $ageValue) {
echo "$name 的年龄是 $ageValue<br>";
}
?>
颜色: red 颜色: green 颜色: blue Peter 的年龄是 35 Ben 的年龄是 37 Joe 的年龄是 43
<?php
$numbers = [1, 2, 3, 4, 5];
echo "原数组: ";
print_r($numbers);
echo "<br>";
// 使用引用修改原数组
foreach ($numbers as &$number) {
$number = $number * 2;
}
echo "修改后: ";
print_r($numbers);
// 重要:使用后取消引用
unset($number);
?>
<?php
$students = [
"class1" => ["Alice", "Bob", "Charlie"],
"class2" => ["David", "Eva", "Frank"],
"class3" => ["Grace", "Henry", "Ivy"]
];
foreach ($students as $className => $studentList) {
echo "<h3>$className</h3>";
echo "<ul>";
foreach ($studentList as $index => $student) {
echo "<li>学生 " . ($index + 1) . ": $student</li>";
}
echo "</ul>";
}
?>
<?php
$people = [
[1, "Alice", "alice@example.com"],
[2, "Bob", "bob@example.com"],
[3, "Charlie", "charlie@example.com"]
];
foreach ($people as list($id, $name, $email)) {
echo "ID: $id, 姓名: $name, 邮箱: $email<br>";
}
// PHP 7.1+ 使用方括号语法
foreach ($people as [$id, $name, $email]) {
echo "ID: $id, 姓名: $name, 邮箱: $email<br>";
}
?>
在 for 和 foreach 循环中,可以使用 break 和 continue 来控制循环流程。
<?php
// for 循环中的 break
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
echo "遇到 5,终止循环<br>";
break;
}
echo "当前数字: $i<br>";
}
echo "<br>";
// foreach 循环中的 break
$fruits = ["apple", "banana", "cherry", "date", "elderberry"];
foreach ($fruits as $fruit) {
if ($fruit == "cherry") {
echo "找到 cherry,停止遍历<br>";
break;
}
echo "水果: $fruit<br>";
}
?>
<?php
// for 循环中的 continue
for ($i = 1; $i <= 5; $i++) {
if ($i == 3) {
echo "跳过数字 3<br>";
continue;
}
echo "当前数字: $i<br>";
}
echo "<br>";
// foreach 循环中的 continue
$numbers = [1, 2, 3, 4, 5, 6];
foreach ($numbers as $number) {
if ($number % 2 == 0) {
continue; // 跳过偶数
}
echo "奇数: $number<br>";
}
?>
<?php
// 嵌套循环中的 break
for ($i = 1; $i <= 3; $i++) {
echo "外层循环: $i<br>";
for ($j = 1; $j <= 3; $j++) {
if ($i == 2 && $j == 2) {
echo "跳出外层循环<br>";
break 2; // 跳出2层循环
}
echo "内层循环: $j<br>";
}
}
echo "<br>";
// 嵌套循环中的 continue
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($j == 2) {
continue 2; // 继续外层循环的下一次迭代
}
echo "i=$i, j=$j<br>";
}
}
?>
<?php
// 使用 for 循环处理数组
$numbers = [10, 20, 30, 40, 50];
$squaredNumbers = [];
for ($i = 0; $i < count($numbers); $i++) {
$squaredNumbers[] = $numbers[$i] * $numbers[$i];
}
echo "平方数: " . implode(', ', $squaredNumbers) . "<br>";
// 使用 foreach 处理关联数组
$products = [
"laptop" => 1200,
"mouse" => 25,
"keyboard" => 80,
"monitor" => 300
];
$expensiveProducts = [];
foreach ($products as $product => $price) {
if ($price > 100) {
$expensiveProducts[$product] = $price;
}
}
echo "高价产品: <br>";
foreach ($expensiveProducts as $product => $price) {
echo "- $product: $$price<br>";
}
?>
<?php
// 生成导航菜单
$menuItems = [
"首页" => "/",
"产品" => "/products",
"关于我们" => "/about",
"服务" => "/services",
"联系我们" => "/contact"
];
echo "<nav><ul>";
foreach ($menuItems as $text => $url) {
$active = ($url == "/products") ? ' class="active"' : ''; // 模拟当前页面
echo "<li><a href='$url'$active>$text</a></li>";
}
echo "</ul></nav>";
echo "<br>";
// 生成日历网格
echo "<div class='calendar'>";
echo "<div class='week'>";
for ($day = 1; $day <= 31; $day++) {
echo "<div class='day'>$day</div>";
// 每周换行
if ($day % 7 == 0) {
echo "</div><div class='week'>";
}
}
echo "</div></div>";
?>
<?php
// 计算阶乘
function factorial($n) {
$result = 1;
for ($i = 1; $i <= $n; $i++) {
$result *= $i;
}
return $result;
}
echo "5的阶乘: " . factorial(5) . "<br>";
// 生成斐波那契数列
function fibonacci($count) {
$fib = [0, 1];
for ($i = 2; $i < $count; $i++) {
$fib[$i] = $fib[$i-1] + $fib[$i-2];
}
return array_slice($fib, 0, $count);
}
echo "斐波那契数列 (前10个): " . implode(', ', fibonacci(10)) . "<br>";
// 查找质数
function findPrimes($limit) {
$primes = [];
for ($num = 2; $num <= $limit; $num++) {
$isPrime = true;
for ($i = 2; $i <= sqrt($num); $i++) {
if ($num % $i == 0) {
$isPrime = false;
break;
}
}
if ($isPrime) {
$primes[] = $num;
}
}
return $primes;
}
echo "100以内的质数: " . implode(', ', findPrimes(100)) . "<br>";
?>
<?php
// 优化前:在循环条件中重复计算
$data = [1, 2, 3, 4, 5];
for ($i = 0; $i < count($data); $i++) { // count() 在每次迭代都执行
echo $data[$i] . "<br>";
}
echo "<br>";
// 优化后:预先计算循环次数
$data = [1, 2, 3, 4, 5];
$count = count($data); // 预先计算
for ($i = 0; $i < $count; $i++) {
echo $data[$i] . "<br>";
}
echo "<br>";
// 对于大型数组,foreach 通常比 for 更快
$largeArray = range(1, 1000);
// 使用 foreach(推荐)
foreach ($largeArray as $value) {
// 处理数据
}
// 使用 for
for ($i = 0, $count = count($largeArray); $i < $count; $i++) {
// 处理数据
}
?>
循环选择指南:
<?php
// 错误1:在循环内修改数组长度
$numbers = [1, 2, 3, 4, 5];
/*
for ($i = 0; $i < count($numbers); $i++) {
if ($numbers[$i] == 3) {
unset($numbers[$i]); // 这会改变数组长度和索引
}
}
*/
// 正确做法:从后往前遍历或使用新数组
for ($i = count($numbers) - 1; $i >= 0; $i--) {
if ($numbers[$i] == 3) {
unset($numbers[$i]);
}
}
// 错误2:在 foreach 中使用引用后不 unset
$items = [1, 2, 3];
foreach ($items as &$item) {
$item *= 2;
}
// unset($item); // 重要:使用后取消引用
// 错误3:在循环中执行不必要的数据库查询或文件操作
// 应该将这些操作移到循环外或进行批量处理
?>
<?php
// PHP 7.1+ 方括号列表语法
$coordinates = [
[1, 2],
[3, 4],
[5, 6]
];
foreach ($coordinates as [$x, $y]) {
echo "坐标: ($x, $y)<br>";
}
// 传统方式(PHP 7.1 之前)
foreach ($coordinates as $coord) {
list($x, $y) = $coord;
echo "坐标: ($x, $y)<br>";
}
?>
<?php
// PHP 8+ match 表达式在循环中的应用
$scores = [85, 92, 78, 45, 60];
foreach ($scores as $index => $score) {
$grade = match(true) {
$score >= 90 => 'A',
$score >= 80 => 'B',
$score >= 70 => 'C',
$score >= 60 => 'D',
default => 'F'
};
echo "学生 " . ($index + 1) . ": 分数 $score, 等级 $grade<br>";
}
?>
for (初始值; 条件; 增量)break 终止循环,使用 continue 跳过当前迭代unset 引用变量