You need to enable JavaScript to run this app. 如何将GROUP_CONCAT查询结果拆分后存储为无嵌套的一维数组
优惠活动
大模型
产品
解决方案
定价
更多

如何将GROUP_CONCAT查询结果拆分后存储为无嵌套的一维数组

问题描述

我在处理一个唱片数据库,为了方便部分场景下的数据展示,我在SQL查询中对部分列使用了GROUP_CONCAT()函数。
查询语句如下:

SELECT
     aName as Album,
     atSong as Track_Number,
     tName as Track,
     GROUP_CONCAT(subTLV SEPARATOR ', ') as Option,
     GROUP_CONCAT(subTranslator SEPARATOR ', ') as Translator,
     GROUP_CONCAT(subLanguage SEPARATOR ', ') as Subtitles,
     GROUP_CONCAT(subURL SEPARATOR ', ') as SRT
FROM ALBUM
     LEFT JOIN ALBUM_TRACK USING (aID)
     LEFT JOIN TRACK_SUBTITLES USING (tCode)
WHERE aName = 'Album'
GROUP BY tName
ORDER BY subLanguage, subTLV, atSong

目前我使用WHILE循环读取查询结果并存储到不同数组中,现有两种实现方法:

while ($row = mysqli_fetch_array($result)) {
     // 方法1
     $GC_SUBS[$i_SUBS] = explode(', ', $row['Subtitles']);
     $i_SUBS++;

     // 方法2
     $a_SUBS[$i_SUBS] = $row['Subtitles'];
     $i_SUBS++;
}

针对包含4首曲目的专辑,两种方法得到的数组结构如下:

// 方法1输出
array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(7) "English"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "English"
    [1]=>
    string(6) "Korean"
  }
  [2]=>
  array(1) {
    [0]=>
    string(7) "English"
  }
  [3]=>
  array(1) {
    [0]=>
    string(7) "English"
  }
}
// 方法2输出
array(4) {
  [0]=>
  string(7) "English"
  [1]=>
  string(15) "English, Korean"
  [2]=>
  string(7) "English"
  [3]=>
  string(7) "English"
}

我希望可以同时完成字符串拆分和数组存储,最终得到仅一层结构的一维数组,预期效果如下:

array(5) {
  [0]=>
  string(7) "English"
  [1]=>
  string(7) "English"
  [2]=>
  string(6) "Korean"
  [3]=>
  string(7) "English"
  [4]=>
  string(7) "English"
}

请问有什么方法可以实现该需求?

解决方案

有两种常用的实现方式可以达到你的需求:

方式1:循环读取时直接拼接一维数组(推荐)

无需额外计数器,直接将每一行拆分后的字幕语言逐个追加到目标数组即可:

$subs = [];
while ($row = mysqli_fetch_array($result)) {
    // 拆分当前行的字幕语言字符串
    $currentSubs = explode(', ', $row['Subtitles']);
    // 通过展开运算符将拆分后的元素批量追加到数组末尾
    array_push($subs, ...$currentSubs);
}

如果你的PHP版本低于7.4不支持展开运算符,可以替换为嵌套循环实现:

$subs = [];
while ($row = mysqli_fetch_array($result)) {
    $currentSubs = explode(', ', $row['Subtitles']);
    foreach ($currentSubs as $lang) {
        $subs[] = $lang;
    }
}

方式2:将已生成的二维数组直接展平

如果你已经通过方法1得到了二维数组$GC_SUBS,可以直接用array_merge批量合并:

$finalSubs = array_merge(...$GC_SUBS);

额外优化建议

如果subLanguage字段本身可能包含, 字符,建议将GROUP_CONCAT的分隔符替换为更罕见的特殊字符(比如|),避免拆分时出现误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:24:03