首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 多維數組轉字符串:按鍵名分組並以逗號分隔值的實現

     編輯:PHP 相關知識

問題描述

輸入二維數組:

$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) ?? [];
}

資料庫存儲建議

  • 方案 A (推薦): 關聯表 answer_logs (id, question_id, option_key, user_id, created_at),每選項一行,便於統計分析。
  • 方案 B: JSON 字段 answers JSON (MySQL 5.7+/8.0),存儲 {"43":["A","B"], "42":["C"]},支持 JSON_EXTRACT 查詢。
  • 方案 C (最簡單): 字符串 "43:A,B;42:C,D",僅供展示、不需查詢內部結構時使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved