PHP将SQL查询结果转换为指定格式JSON的问题
解决PHP将SQL查询结果转为指定JSON格式的问题
你遇到的问题主要有两个核心点:一是mysqli_fetch_array()默认只读取单条数据,二是它默认返回的是包含关联键和索引键的混合数组,导致json_encode()输出不符合预期。要得到你想要的JSON结构,需要循环收集所有数据并构建纯索引数组。
问题拆解
mysqli_fetch_array()的局限:这个函数每次调用仅返回结果集中的一行,且默认使用MYSQLI_BOTH模式——返回的数组同时包含数字索引和字段名作为键名,json_encode()会把这种混合数组转成JSON对象(用{}包裹),而非你需要的数组结构(用[]包裹)。- 你需要的标准JSON结构:外层是一个数组,每个元素是包含ID、name、status、value的纯索引数组(无键名)。这里要提一句:你示例中用
{}包裹每个元素是不符合JSON语法的,{}是JSON对象的标识,必须包含键值对;纯值集合应该用[]包裹,这是JSON的规范要求。
解决方案:循环构建纯索引数组
我们可以用mysqli_fetch_row()直接获取每行的索引数组,再循环把所有行收集到一个大数组中,最后转成JSON即可:
// 执行查询 $sql = "SELECT * FROM example where status='open'"; $result = mysqli_query($link, $sql); // 初始化空数组存储所有数据 $arrayofdata = []; // 循环遍历结果集,收集每行的索引数组 while ($row = mysqli_fetch_row($result)) { // 可选:将ID从字符串转为整数(mysqli默认返回字符串类型) $row[0] = (int)$row[0]; $arrayofdata[] = $row; } // 转换为目标JSON格式 $JSONED = json_encode($arrayofdata);
最终输出
执行后$JSONED的内容就是符合规范的目标格式:
[[1,"name1","open","value1"],[2,"name2","open","value2"]]
额外拓展
如果后续需要转为带字段名的JSON对象数组(比如[{"ID":1,"name":"name1",...},...]),只需把mysqli_fetch_row()换成mysqli_fetch_assoc(),收集关联数组后再转JSON即可。
内容的提问来源于stack exchange,提问作者Pedro Jose Otero Rodriguez
相关产品推荐
相关产品推荐

