You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:54:42