PHP foreach:用键值对循环数组
PHP foreach 是遍历数组或实现了 Traversable 的对象的惯用方式,不需要手动跟踪索引。需要在每轮同时获取键和值时,使用 foreach ($array as $key => $value)。如果要原地更新元素,请按引用遍历(&$value),并在循环后对循环变量调用 unset(),避免意外覆盖。
PHP foreach 键值遍历示例
输出:
输出将显示在这里...
输出:
苹果: $1.2
面包: $2.5
牛奶: $0.99
这个示例如何工作
$prices是一个关联数组,将商品名映射到价格。foreach ($prices as $item => $price)在每一轮把当前键赋给$item,把当前值赋给$price,不需要手动索引或count()。- 每次迭代都会打印一个键值对。
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 循环对比
| foreach | for |
|---|---|
| 不需要索引变量,完整遍历时更简洁。 | 当你需要索引运算、步进控制或反向遍历时更合适。 |
可用于关联数组和 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 接口的值,包括 Iterator 和 IteratorAggregate 的实现。对于普通对象,它会按作用域遍历可见属性:在类内部可见全部属性,在类外只可见 public 属性。
PHP 里 foreach 和 array_map 有什么区别?
foreach 是控制结构,会为每个元素执行一段代码,因此可以有副作用,比如 echo 或提前 break。array_map 会应用回调并返回一个新数组。需要新数组且不做原地修改时用 array_map。