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

PHP PDO查询结果整理为指定数组格式求助

问题描述

我一直尝试将数据库查询结果格式化为特定数组结构,但操作有误,希望得到帮助。

现有查询语句

$sql = "SELECT tbl1.spec_num As spec_num,
                IF(tbl1.spec_fld, 'TRUE', 'FALSE') As spec_fld,
                tbl2.auth_id As auth_id
        FROM spec_table tbl1
            JOIN spec_auth tbl2 ON tbl1.id=tbl2.spec_table_id
        WHERE tbl1.spec_fld=1
        AND tbl2.enb=1;";

MySQL执行后的查询结果

spec_num                                spec_fld    auth_id
123413253242135234213432112345DDDDDDDG  TRUE        1234567
123413253242135234213432112345DDDDDDDG  TRUE        3423435
123413253242135234213432112345DDDDDDDG  TRUE        9234245

当前PHP PDO代码

$stmt = $connection->prepare($sql); 
$stmt->execute();
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $result_json = json_encode($result);
    echo $result_json;
} 

预期生成的数组结构

需要创建变量$dtp,结构如下:

$dtp = [    
   'spec_num' => '123413253242135234213432112345DDDDDDDG',
   'spec_fld' => TRUE,  
   'auth_ids' => [          
      '1234567',        
      '3423435', 
      '9234245',        
      ],    
   ];

最佳实现方式

直接通过循环遍历查询结果,构建目标数组即可,具体代码如下:

// 初始化目标数组结构
$dtp = [
    'spec_num' => '',
    'spec_fld' => false,
    'auth_ids' => []
];

$stmt = $connection->prepare($sql); 
$stmt->execute();

while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 仅第一次循环时设置spec_num和spec_fld(所有结果行这两个值一致)
    if (empty($dtp['spec_num'])) {
        $dtp['spec_num'] = $result['spec_num'];
        // 将字符串'TRUE'转换为布尔值TRUE
        $dtp['spec_fld'] = $result['spec_fld'] === 'TRUE';
    }
    // 收集所有auth_id到数组中
    $dtp['auth_ids'][] = $result['auth_id'];
}

// 可通过print_r($dtp)查看最终结构

关键说明

  • 由于查询结果中spec_num和spec_fld的值所有行完全一致,因此仅在第一次循环时赋值,避免重复操作
  • 通过严格相等判断将数据库返回的字符串'TRUE'转换为布尔值,匹配预期结构要求
  • 循环中直接将每个auth_id追加到auth_ids数组,无需额外处理

内容的提问来源于stack exchange,提问作者carol1287

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:35:15