PHP 零基础教程

PHP foreach 循环

foreach 循环是 PHP 中用于遍历数组的标准且高度专业的语法结构。与需要你手动管理计数器或索引指针的 forwhile 循环不同,foreach 会自动处理数组的内部指针。这使得在处理数据集合时,代码更加整洁,且极大地降低了出错的概率。

1. 遍历索引数组

对于简单的、以数字为索引的数组,foreach 提供了直接访问每个元素值的捷径。你只需要定义一个临时变量,它会在当前循环迭代期间保存该元素的值。

<?php
$products = ['笔记本电脑', '鼠标', '键盘', '显示器'];

foreach ($products as $product) {
    // PHP_EOL 是 PHP 内置的换行符常量,能跨平台兼容
    echo "商品:" . $product . PHP_EOL;
}
?>

在执行这段代码时,PHP 在内部会自动从索引 0 开始步进遍历 $products 数组,直到最后一个元素。你完全不需要去追踪数组的计数,或者拿它去和 count($products) 的结果做比较。

2. 处理关联数组

当处理关联数组时,foreach 真正的威力就显现出来了。在关联数组中,你通常既需要键(标识符),也需要值(数据)。此时语法可以扩展,通过 => 运算符来同时捕获键和值。

<?php
$userSettings = [
    'theme' => 'dark',
    'notifications' => true,
    'language' => 'zh-CN',
    'version' => 1.2
];

foreach ($userSettings as $key => $value) {
    // 使用三元运算符将布尔值强制转换为字符串以便输出
    $displayValue = is_bool($value) ? ($value ? '开启 (true)' : '关闭 (false)') : $value;
    
    echo "设置项 '{$key}' 的当前值为:{$displayValue}" . PHP_EOL;
}
?>

在处理表单输入、数据库查询结果或是配置对象时,键(key)往往为值(value)提供了具体的语义背景,这种语法结构在此时是不可或缺的。

3. 通过引用修改数组元素

默认情况下,foreach 循环中的值变量只是数组元素的一个副本(拷贝)。如果你尝试在循环内部修改这个变量,原始的数组将保持不变。

如果想要在迭代期间直接修改原始数组的值,你必须在值变量的前面加上 &(引用)运算符。

<?php
$prices = [10.00, 20.00, 30.00];

// 给每个价格加上 10% 的税
foreach ($prices as &$price) {
    $price *= 1.10;
}

// 极其重要:循环结束后销毁引用
unset($price);

print_r($prices);
?>

警告: 循环结束后,务必使用 unset() 销毁该引用变量。因为如果不这样做,$price 将会一直保持对数组最后一个元素的内存引用。在脚本后续的代码中,如果你无意间再次使用了 $price 变量并给它赋了新值,你将会意外地篡改 $prices 数组里的最后一个元素!这是 PHP 中最臭名昭著的 Bug 来源之一。

4. 执行流程可视化

foreach 循环的底层运作方式是:首先获取当前元素的指针,在执行代码块之前,将该指针指向的值赋给定义好的变量。

它的基本执行流如下:

  1. 开始循环
  2. 还有更多元素吗?
    1. 是 (Yes): 将当前值赋值给变量 -> 执行代码块 -> 内部数组指针向前移动一步 -> 返回第 2 步。
    2. 否 (No): 退出循环。