在PHP开发过程中,从数据库查询到数据后,将结果集转换为数组是后续进行数据筛选、遍历、传递的基础操作,不同的数据库扩展提供了不同的实现方式,开发者可以根据自己使用的扩展选择合适的方法。

使用mysqli扩展转换结果集为数组
mysqli是PHP中常用的MySQL数据库扩展,它提供了多个函数可以将查询结果转换为数组,不同函数的返回形式略有区别。
mysqli_fetch_array函数
这个函数可以将结果集的一行转换为数组,默认同时返回索引数组和关联数组,也可以通过第二个参数指定返回类型。
<?php
// 连接数据库
$conn = mysqli_connect("127.0.0.1", "root", "password", "test_db");
if (!$conn) {
die("数据库连接失败: " . mysqli_connect_error());
}
// 执行查询
$sql = "SELECT id, name, age FROM users";
$result = mysqli_query($conn, $sql);
// 存储所有结果的数组
$data = [];
// 循环获取每一行结果,默认返回关联数组和索引数组
while ($row = mysqli_fetch_array($result)) {
$data[] = $row;
}
// 如果只需要关联数组,可以传入MYSQLI_ASSOC参数
// while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
// $data[] = $row;
// }
// 如果只需要索引数组,可以传入MYSQLI_NUM参数
// while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
// $data[] = $row;
// }
// 输出结果查看
print_r($data);
// 释放结果集
mysqli_free_result($result);
// 关闭连接
mysqli_close($conn);
?>
mysqli_fetch_assoc和mysqli_fetch_row函数
mysqli_fetch_assoc只返回关联数组,键名是字段名;mysqli_fetch_row只返回索引数组,键名是数字下标,使用方式和mysqli_fetch_array类似。
<?php
$conn = mysqli_connect("127.0.0.1", "root", "password", "test_db");
$sql = "SELECT id, name, age FROM users";
$result = mysqli_query($conn, $sql);
// 使用mysqli_fetch_assoc获取关联数组
$assocData = [];
while ($row = mysqli_fetch_assoc($result)) {
$assocData[] = $row;
}
// 重置结果集指针,才能再次遍历
mysqli_data_seek($result, 0);
// 使用mysqli_fetch_row获取索引数组
$numData = [];
while ($row = mysqli_fetch_row($result)) {
$numData[] = $row;
}
print_r($assocData);
print_r($numData);
mysqli_free_result($result);
mysqli_close($conn);
?>
使用PDO扩展转换结果集为数组
PDO是PHP的数据库抽象层,支持多种数据库,转换结果集为数组的方式更加简洁。
fetchAll方法
PDO的fetchAll方法可以直接获取结果集中的所有行,通过传入不同的参数可以指定返回数组的类型。
<?php
try {
// 连接数据库,这里以MySQL为例
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test_db", "root", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 执行查询
$sql = "SELECT id, name, age FROM users";
$stmt = $pdo->query($sql);
// 默认返回关联数组和索引数组,和mysqli_fetch_array默认行为一致
$allData = $stmt->fetchAll();
// 只返回关联数组
$assocData = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 只返回索引数组
$numData = $stmt->fetchAll(PDO::FETCH_NUM);
// 返回对象数组
$objData = $stmt->fetchAll(PDO::FETCH_OBJ);
print_r($assocData);
} catch (PDOException $e) {
echo "数据库操作失败: " . $e->getMessage();
}
?>
fetch方法逐行获取
如果需要逐行处理数据,可以使用fetch方法,每次获取一行结果,同样可以指定返回类型。
<?php
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test_db", "root", "password");
$sql = "SELECT id, name, age FROM users";
$stmt = $pdo->query($sql);
$rowData = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$rowData[] = $row;
}
print_r($rowData);
?>
不同转换方式的区别
不同的转换函数返回数组的形式不同,开发者可以根据实际需求选择:
- 如果需要同时获取字段名和数字下标对应的数据,选择返回两种数组的类型
- 如果只需要通过字段名访问数据,选择关联数组类型,代码可读性更高
- 如果只需要按顺序获取字段值,选择索引数组类型即可
| 函数/方法 | 返回数组类型 | 适用扩展 |
|---|---|---|
| mysqli_fetch_array | 可指定关联、索引或两者都有 | mysqli |
| mysqli_fetch_assoc | 仅关联数组 | mysqli |
| mysqli_fetch_row | 仅索引数组 | mysqli |
| fetchAll | 可指定多种返回类型 | PDO |
| fetch | 可指定多种返回类型,逐行获取 | PDO |
注意事项
在使用结果转数组操作时,需要注意以下几点:
- 操作前需要确保查询执行成功,结果集有效,避免出现错误
- 使用mysqli扩展遍历结果集后,如果需要再次遍历,要使用
mysqli_data_seek重置结果集指针 - 不需要结果集时要及时释放,避免占用资源
- 数据库连接的账号密码等敏感信息不要硬编码在代码中,最好放在配置文件里
将PHP查询结果转换为数组是数据处理的基础操作,掌握不同扩展下的实现方式,可以让开发过程更加顺畅,根据实际场景选择合适的转换方法即可。
PHP数据库查询结果转数组mysqli_fetch_array修改时间:2026-07-21 19:12:31