如何用PHP处理JSON数据并按组合格式插入MySQL数据库
生成笛卡尔积并插入MySQL的解决方案
问题背景
现有动态生成的JSON数据(name和vals字段固定,值动态生成):
[ { "name": "language", "vals": [ "en", "de", "it", "es" ] }, { "name": "currency", "vals": [ "usd", "eur" ] } ]
已通过json_decode转换为PHP数组:
array(2) { [0]=> array(2) { ["name"]=> string(8) "language" ["vals"]=> array(4) { [0]=> string(2) "en" [1]=> string(2) "de" [2]=> string(2) "it" [3]=> string(2) "es" } } [1]=> array(2) { ["name"]=> string(8) "currency" ["vals"]=> array(2) { [0]=> string(3) "usd" [1]=> string(3) "eur" } } }
需要将数据生成如下笛卡尔积格式并插入MySQL:
| name1 | vals1 | name2 | vals2 |
|---|---|---|---|
| language | en | currency | usd |
| language | en | currency | eur |
| language | de | currency | usd |
| language | de | currency | eur |
| language | it | currency | usd |
| language | it | currency | eur |
| language | es | currency | usd |
| language | es | currency | eur |
实现步骤
1. 生成笛卡尔积数据
编写通用函数处理任意数量的分组,生成对应笛卡尔积组合:
function generateCartesianProduct($groups) { $result = [[]]; foreach ($groups as $group) { $temp = []; foreach ($result as $product) { foreach ($group['vals'] as $val) { $temp[] = array_merge($product, [ 'name' => $group['name'], 'val' => $val ]); } } $result = $temp; } // 转换为数据库所需的键值对格式 $finalData = []; foreach ($result as $item) { $row = []; foreach ($item as $index => $pair) { $row['name' . ($index + 1)] = $pair['name']; $row['vals' . ($index + 1)] = $pair['val']; } $finalData[] = $row; } return $finalData; } // 使用示例 $jsonString = '[{"name":"language","vals":["en","de","it","es"]},{"name":"currency","vals":["usd","eur"]}]'; $phpArray = json_decode($jsonString, true); $cartesianData = generateCartesianProduct($phpArray);
2. 批量插入MySQL数据库
以PDO为例实现批量插入,保证效率与安全性:
// 数据库连接配置 $dsn = 'mysql:host=你的主机地址;dbname=你的数据库名;charset=utf8mb4'; $username = '你的用户名'; $password = '你的密码'; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 动态生成插入SQL语句 $fieldNames = []; $placeholders = []; foreach ($cartesianData[0] as $key => $val) { $fieldNames[] = "`$key`"; $placeholders[] = ":" . $key; } $sql = "INSERT INTO 你的表名 (" . implode(', ', $fieldNames) . ") VALUES (" . implode(', ', $placeholders) . ")"; $stmt = $pdo->prepare($sql); // 批量执行插入 foreach ($cartesianData as $row) { $stmt->execute($row); } echo "数据插入成功!"; } catch (PDOException $e) { die("插入失败: " . $e->getMessage()); }
额外说明
- 该方案支持任意数量的分组,会自动生成对应
nameN和valsN字段,无需修改代码适配分组数量。 - 使用预处理语句避免SQL注入,同时提升批量插入的效率。
- 请根据实际场景替换数据库连接参数、表名等信息。
内容的提问来源于stack exchange,提问作者Serpentdriver
相关产品推荐
相关产品推荐

