You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:

name1vals1name2vals2
languageencurrencyusd
languageencurrencyeur
languagedecurrencyusd
languagedecurrencyeur
languageitcurrencyusd
languageitcurrencyeur
languageescurrencyusd
languageescurrencyeur

实现步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:14:52