应直接使用 mysqli_fetch_assoc() 或 PDO::FETCH_ASSOC 获取关联数组,避免默认 MYSQLI_BOTH 造成的内存浪费和下标混淆,无需查询后再转换。

PHP 查询数据库后默认得到的是索引数组(如 mysqli_fetch_array 默认行为),要直接拿到关联数组,关键不是“转换”,而是从查询阶段就指定返回方式。
用 mysqli_fetch_assoc() 直接取关联数组
这是最常用、最干净的方式:跳过索引数组,一步到位拿到键名 = 字段名的数组。
-
mysqli_fetch_assoc($result)只返回关联键(如['id' => 1, 'name' => 'Alice']),不带数字下标 - 对比
mysqli_fetch_array($result, MYSQLI_ASSOC)功能等价,但fetch_assoc更语义明确、少写参数 - 如果用
PDO,则用$stmt->fetch(PDO::FETCH_ASSOC) - 注意:必须在
mysqli_query()或PDO::query()成功执行后,对结果集调用,不能对 SQL 字符串直接调用
为什么 mysqli_fetch_array() 默认不是关联数组?
因为它的默认模式是 MYSQLI_BOTH,会同时生成数字键和关联键(如 [0 => 1, 'id' => 1]),浪费内存且容易引发下标混淆。
- 显式传参
MYSQLI_ASSOC可以让它只返回关联键,效果同fetch_assoc - 若误用
MYSQLI_NUM,就只能拿到[0 => 1, 1 => 'Alice'],字段名信息完全丢失 - 这种“双模式”设计是历史兼容性遗留,新项目建议统一用
fetch_assoc或PDO::FETCH_ASSOC
查完再转?没必要,但真要转也得小心
不推荐查出索引数组后再用 array_combine() 或循环重建——既多一次遍历,又得手动维护字段顺序。
立即学习“PHP免费学习笔记(深入)”;
- 如果非要用
mysqli_fetch_row()(只返回数字索引),那必须配合mysqli_fetch_fields()才能人工拼出关联结构 - 示例片段:
$row = mysqli_fetch_row($result); $fields = mysqli_fetch_fields($result); $assoc = array_combine(array_column($fields, 'name'), $row);
- 这个组合在字段含别名(
AS)、有计算列或 NULL 值时容易出错,不如一开始就用fetch_assoc
真正容易被忽略的是:PDO 默认 fetch mode 是 PDO::FETCH_BOTH,和 mysqli 一样;如果没全局设置或每次调用都指定 PDO::FETCH_ASSOC,照样拿到重复键名的数组。











