如何在PHP中将SQL查询结果存储为常规关联数组?
解决PHP中SQL查询结果转为目标关联数组的问题
问题分析
当前输出是三层嵌套数组[[{"answer":"1000"}],[{"answer":"1000"}],...],原因有两个:
$wpdb->get_results()默认返回多行结果的数组,哪怕单条记录也会被包裹在一个数组里;- 循环调用时直接将这个数组整体追加到
$answers2,导致额外的嵌套层级。
解决方案
根据你的需求场景选择对应方案:
场景1:每个question_id对应唯一一条答案
用$wpdb->get_row()替代get_results(),直接获取单行关联数组,避免多余嵌套:
protected function get_answers_with_question_id($id){ global $wpdb; // 用prepare防止SQL注入,必须处理用户传入的参数 $sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}aysquiz_answers WHERE question_id = %d", $id ); // ARRAY_A指定返回单行关联数组 $answer = $wpdb->get_row($sql, 'ARRAY_A'); return $answer; }
调用后$answers2的结构会是:
[{"answer":"1000"},{"answer":"1000"},{"answer":"1000"}]
场景2:每个question_id对应多条答案,需结构化存储
如果要以question_id为键关联对应的答案数组,修改循环逻辑:
foreach ($questions_ids as $id) { $answers2[$id] = $this->get_answers_with_question_id($id); }
输出结构示例:
{ "1": [{"answer":"1000"}], "2": [{"answer":"1000"}], "3": [{"answer":"1000"}] }
场景3:提取所有答案值为一维关联数组
若只需保留answer值并以question_id为键:
foreach ($questions_ids as $id) { $answers = $this->get_answers_with_question_id($id); // 处理可能为空的情况,避免报错 $answers2[$id] = $answers[0]['answer'] ?? null; }
输出结构示例:
{"1":"1000","2":"1000","3":"1000"}
重要提醒
一定要使用$wpdb->prepare()处理SQL参数,避免SQL注入风险,这是WordPress数据库操作的最佳实践。
内容的提问来源于stack exchange,提问作者Jiří Kopřiva
相关产品推荐
相关产品推荐

