如何移除PHP数组中的动态键?Mysqli查询结果格式优化
问题描述
使用mysqli执行查询并获取结果后,通过PHP代码转换为数组时生成了1、2、3这类不必要的动态键,希望移除这些键,得到结构更简洁的JSON格式。
现有PHP代码:
if($num > 0) { $quest_arr['error'] = 'false'; $quest_arr['message'] = 'Success'; $quest_arr['data'] = array(); $questions = []; foreach ($result as $r) { if (!isset($questions[$r['QuestionId']])) { $questions[$r['QuestionId']] = [ 'QuestionId' => $r['QuestionId'], 'question' => $r['QuestionName'], 'answers'=> [] ]; } $questions[$r['QuestionId']]['answers'][] = $r['AnswerID']; } array_push($quest_arr['data'], $questions); echo json_encode($quest_arr, JSON_NUMERIC_CHECK); } else { echo json_encode( array('error' => 'true','message' => 'Error') ); }
当前生成的JSON(含多余动态键):
{ "error": "false", "message": "Success", "data": [ { "1": { "QuestionId": 1, "question": "Question 1", "answers": [ 1, 2, 3 ] }, "2": { "QuestionId": 2, "question": "Question 2", "answers": [ null ] }, "3": { "QuestionId": 3, "question": "Question 3", "answers": [ null ] } } ] }
期望的JSON格式:
{ "error": "false", "message": "Success", "data": [ { "QuestionId": 1, "question": "Question 1", "answers": [ 1, 2, 3 ] }, { "QuestionId": 2, "question": "Question 2", "answers": [ null ] }, { "QuestionId": 3, "question": "Question 3", "answers": [ null ] } ] }
解决方案
问题核心是$questions数组是以QuestionId作为键名的关联数组,直接推入data会保留这些自定义键。只需将关联数组转换为纯索引数组,即可移除多余动态键。
修改要点:
- 使用
array_values($questions)提取关联数组中的值,生成不带自定义键的索引数组 - 替换原
array_push($quest_arr['data'], $questions)语句,直接将转换后的索引数组赋值给data(原代码中data多嵌套了一层对象,期望格式里data直接是问题对象的数组)
修改后的代码
if($num > 0) { $quest_arr['error'] = 'false'; $quest_arr['message'] = 'Success'; $quest_arr['data'] = array(); $questions = []; foreach ($result as $r) { if (!isset($questions[$r['QuestionId']])) { $questions[$r['QuestionId']] = [ 'QuestionId' => $r['QuestionId'], 'question' => $r['QuestionName'], 'answers' => [] ]; } $questions[$r['QuestionId']]['answers'][] = $r['AnswerID']; } // 将关联数组转为索引数组后赋值给data $quest_arr['data'] = array_values($questions); echo json_encode($quest_arr, JSON_NUMERIC_CHECK); } else { echo json_encode( array('error' => 'true','message' => 'Error') ); }
验证结果
修改后生成的JSON将完全匹配期望格式,data数组中直接包含每个问题的对象,不再有1、2、3这类动态键。
内容的提问来源于stack exchange,提问作者Gladium
相关产品推荐
相关产品推荐

