如何将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
相关产品推荐
相关产品推荐

