輸入二維數組:
$data = [
43 => ['A' => 'A', 'B' => 'B'],
42 => ['C' => 'C', 'D' => 'D'],
41 => ['B' => 'B', 'C' => 'C'],
];
期望輸出:按外層鍵 (ID) 分組,內層值用逗號連接:
43 => "A,B"
42 => "C,D"
41 => "B,C"
function flattenAnswers(array $data): array {
$result = [];
foreach ($data as $id => $answers) {
// 內層值可能是關聯數組,取 values()
$values = array_values($answers);
$result[$id] = implode(',', $values);
}
return $result;
}
print_r(flattenAnswers($data));
/*
Array
(
[43] => A,B
[42] => C,D
[41] => B,C
)
*/
// ❌ 錯誤:雙重 foreach 導致值重複累積
foreach ($data as $id => $answers) {
foreach ($answers as $key => $val) {
$result[$key] .= ',' . $val; // 按內層鍵名合併,而非外層 ID
}
}
// 結果: ['A' => 'A,A', 'B' => 'B,B,B', ...] 錯誤
function processAnswers(array $data, bool $unique = true, bool $sort = true): array {
$result = [];
foreach ($data as $qid => $answers) {
$vals = array_values($answers); // 僅取值
if ($unique) $vals = array_unique($vals);
if ($sort) sort($vals);
$result[$qid] = implode(',', $vals);
}
return $result;
}
// 如果需要存儲為單一字符串 (如存入 TEXT 字段)
function serializeAnswers(array $data): string {
return json_encode(flattenAnswers($data), JSON_UNESCAPED_UNICODE);
}
// 還原
function unserializeAnswers(string $json): array {
return json_decode($json, true) ?? [];
}
answer_logs (id, question_id, option_key, user_id, created_at),每選項一行,便於統計分析。answers JSON (MySQL 5.7+/8.0),存儲 {"43":["A","B"], "42":["C"]},支持 JSON_EXTRACT 查詢。"43:A,B;42:C,D",僅供展示、不需查詢內部結構時使用。