php如何实现遍历
遍历数组
使用 foreach 循环遍历数组是最常见的方式,适用于索引数组和关联数组。
$array = [1, 2, 3, 'a' => 'apple'];
foreach ($array as $value) {
echo $value . "\n";
}
若需要键名和键值:
foreach ($array as $key => $value) {
echo "$key: $value\n";
}
遍历对象
通过 foreach 遍历对象的可见属性(public):
class Example {
public $prop1 = 'value1';
public $prop2 = 'value2';
}
$obj = new Example();
foreach ($obj as $key => $value) {
echo "$key: $value\n";
}
使用 for 循环遍历索引数组
适用于已知长度的索引数组:
$array = [10, 20, 30];
for ($i = 0; $i < count($array); $i++) {
echo $array[$i] . "\n";
}
使用 while 和 list 遍历关联数组
结合 each 函数(PHP 7.2+已弃用,建议改用 foreach):
$array = ['a' => 1, 'b' => 2];
reset($array); // 重置指针
while (list($key, $value) = each($array)) {
echo "$key: $value\n";
}
使用 array_walk 函数
对数组每个元素应用自定义函数:
$array = ['x' => 10, 'y' => 20];
array_walk($array, function($value, $key) {
echo "$key => $value\n";
});
遍历多维数组
嵌套 foreach 处理多维结构:
$multiArray = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob']
];
foreach ($multiArray as $subArray) {
foreach ($subArray as $key => $value) {
echo "$key: $value ";
}
echo "\n";
}
使用 Iterator 接口实现自定义遍历
通过实现 Iterator 接口控制对象遍历行为:
class CustomIterator implements Iterator {
private $position = 0;
private $data = ['first', 'second', 'third'];
public function current() { return $this->data[$this->position]; }
public function key() { return $this->position; }
public function next() { ++$this->position; }
public function rewind() { $this->position = 0; }
public function valid() { return isset($this->data[$this->position]); }
}
$iterator = new CustomIterator();
foreach ($iterator as $value) {
echo $value . "\n";
}
使用 array_map 批量处理数组
对数组每个元素执行回调并返回新数组:
$numbers = [1, 2, 3];
$squared = array_map(function($n) { return $n * $n; }, $numbers);
print_r($squared);
使用 RecursiveIterator 遍历嵌套结构
处理多层嵌套数组或对象:
$deepArray = [
'level1' => [
'level2' => ['a', 'b']
]
];
$iterator = new RecursiveArrayIterator($deepArray);
$recursive = new RecursiveIteratorIterator($iterator);
foreach ($recursive as $value) {
echo $value . "\n";
}
注意事项
- 关联数组推荐使用
foreach,避免for循环因非连续键导致问题。 - 遍历大型数据集时,生成器(
yield)可节省内存。 - PHP 8.1+ 支持
array_is_list()检测是否为连续索引数组。






