在使用PHP的PDO扩展操作数据库时,我们经常会通过PDO::FETCH_ASSOC参数获取查询结果,这种方式返回的是二维关联数组,数组的每一行对应一条数据库记录,每一行的键是对应数据表的字段名,值是字段对应的内容。要处理这些返回的数据,就需要掌握正确的遍历方式。
什么是PDO::FETCH_ASSOC返回的二维关联数组
首先我们来看一个典型的PDO查询示例,当设置fetch模式为PDO::FETCH_ASSOC时,返回的数组结构如下:
<?php // 假设已经建立了PDO连接,存储在$pdo变量中 $sql = "SELECT id, username, age FROM users WHERE age > 18"; $stmt = $pdo->prepare($sql); $stmt->execute(); // 设置fetch模式为PDO::FETCH_ASSOC,获取所有结果 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // 打印结果查看结构 print_r($result); // 输出类似如下内容: // Array // ( // [0] => Array // ( // [id] => 1 // [username] => zhangsan // [age] => 20 // ) // [1] => Array // ( // [id] => 2 // [username] => lisi // [age] => 22 // ) // ) ?>
常用遍历方法
1. foreach循环遍历(最推荐)
foreach是PHP中遍历数组最简洁高效的方式,对于二维关联数组来说,外层遍历每一行记录,内层遍历每一行的字段键值对即可。
<?php
// 外层遍历每一行记录
foreach ($result as $row) {
// 内层遍历当前行的所有字段
foreach ($row as $fieldName => $fieldValue) {
echo "字段名:{$fieldName},字段值:{$fieldValue}<br/>";
}
echo "------------------<br/>";
}
// 如果只需要获取指定字段,也可以直接通过键名访问
foreach ($result as $row) {
echo "用户ID:{$row['id']},用户名:{$row['username']},年龄:{$row['age']}<br/>";
}
?>
2. while配合each函数遍历
除了foreach,我们也可以使用while循环结合each函数来遍历数组,这种方式在早期的PHP版本中比较常用,不过each函数在PHP 7.2之后已经被废弃,不推荐在新项目中使用。
<?php
// 重置数组指针,确保从第一个元素开始遍历
reset($result);
// 循环获取每个元素
while (list($index, $row) = each($result)) {
echo "第{$index}条记录:<br/>";
echo "ID:{$row['id']},用户名:{$row['username']}<br/>";
}
?>
3. 使用数组迭代器遍历
如果需要更灵活的遍历控制,比如需要中断遍历、或者自定义遍历逻辑,可以使用ArrayIterator迭代器来操作。
<?php
$iterator = new ArrayIterator($result);
// 遍历迭代器
while ($iterator->valid()) {
$row = $iterator->current();
echo "当前记录ID:{$row['id']}<br/>";
// 移动到下一个元素
$iterator->next();
}
?>
遍历注意事项
- 访问数组元素时,要确保键名和数据库字段名完全一致,包括大小写,否则会出现未定义索引的错误。
- 如果查询结果可能为空,遍历前最好先判断数组是否为空,避免不必要的遍历操作:
if (!empty($result)) { foreach ($result as $row) { ... } } - foreach遍历的是数组的拷贝,在遍历过程中修改原数组不会影响遍历结果,而使用引用遍历
foreach ($result as &$row)时要注意及时释放引用,避免后续逻辑出错。 - 如果只需要遍历一次结果,也可以在
execute之后直接通过fetch方法逐行获取,不需要先调用fetchAll获取全部数组再遍历,这样可以减少内存占用。
逐行fetch遍历示例
当数据量较大时,推荐使用逐行fetch的方式,不需要一次性把所有结果存到数组里:
<?php
$stmt = $pdo->prepare("SELECT id, username, age FROM users");
$stmt->execute();
// 设置单行的fetch模式为PDO::FETCH_ASSOC
$stmt->setFetchMode(PDO::FETCH_ASSOC);
// 逐行获取结果并遍历
while ($row = $stmt->fetch()) {
echo "ID:{$row['id']},用户名:{$row['username']}<br/>";
}
?>
PDOFETCH_ASSOC二维关联数组数组遍历修改时间:2026-06-17 11:04:01