PHP foreach:用键值对循环数组

PHP foreach 是遍历数组或实现了 Traversable 的对象的惯用方式,不需要手动跟踪索引。需要在每轮同时获取键和值时,使用 foreach ($array as $key => $value)。如果要原地更新元素,请按引用遍历(&$value),并在循环后对循环变量调用 unset(),避免意外覆盖。

PHP foreach 键值遍历示例

输出:

输出将显示在这里...

输出:

苹果: $1.2
面包: $2.5
牛奶: $0.99

这个示例如何工作

  1. $prices 是一个关联数组,将商品名映射到价格。
  2. foreach ($prices as $item => $price) 在每一轮把当前键赋给 $item,把当前值赋给 $price,不需要手动索引或 count()
  3. 每次迭代都会打印一个键值对。foreach 用同一套语法同时支持索引数组和关联数组。

PHP foreach 常见错误

在按引用循环后忘记 unset()

错误:

foreach ($items as &$item) {
    $item = strtoupper($item);
}
foreach ($items as $item) {} // 会覆盖最后一个元素

正确:

foreach ($items as &$item) {
    $item = strtoupper($item);
}
unset($item);

按引用 foreach 结束后,循环变量仍然指向最后一个元素。复用这个变量时,可能会修改最后一个元素,而不是本地循环值。

以为按值循环会修改原数组

错误:

foreach ($prices as $price) {
    $price *= 1.10; // 修改的是副本,不是原数组
}

正确:

foreach ($prices as &$price) {
    $price *= 1.10;
}
unset($price);

按值迭代时,每个 $price 拿到的都是元素副本。对副本的修改不会写回原数组。

PHP foreach 与 for 循环对比

foreachfor
不需要索引变量,完整遍历时更简洁。当你需要索引运算、步进控制或反向遍历时更合适。
可用于关联数组和 Traversable 对象。只能配合数字索引;关联键通常需要 array_keys()
不太方便做步进遍历(例如每隔一个元素)。非常适合 $i += 2 或倒序计数。

标准的全量数组遍历优先用 foreach。当循环体依赖数字位置或非顺序访问时,改用 for

常见问题

在 PHP foreach 循环里如何同时获取键和值?

使用 $key => $value 语法:foreach ($array as $key => $value)。这样每轮都会拿到 PHP foreach 的键($key)和值($value),索引数组和关联数组都适用。如果只需要值,用 foreach ($array as $value)

foreach 可以遍历对象吗,还是只能遍历数组?

foreach 可以遍历任何实现了 Traversable 接口的值,包括 IteratorIteratorAggregate 的实现。对于普通对象,它会按作用域遍历可见属性:在类内部可见全部属性,在类外只可见 public 属性。

PHP 里 foreach 和 array_map 有什么区别?

foreach 是控制结构,会为每个元素执行一段代码,因此可以有副作用,比如 echo 或提前 breakarray_map 会应用回调并返回一个新数组。需要新数组且不做原地修改时用 array_map