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

如何在PHP中合并两个不同JSON数组并写入MySQL

问题描述

这是我在Stackoverflow的首次提问。如何在PHP中正确地从两个不同链接读取包含不同数据项的JSON数组,并将它们合并为单个数组?目标是生成一个包含两个JSON数据集值的数组,以便后续插入MySQL。

期望得到的数组结构如下:

Array 
(
    [1] => 'HourDK' value         // 数据集1
    [2] => 'PriceArea' value      // 数据集1
    [3] => 'SpotPriceDKK' value   // 数据集1
    [4] => 'Price1' value         // 数据集2
)

最终要生成24个数组,每个数组对应一小时的数据,并按"HourDK"排序,之后将这些数组插入MySQL。

我的json.php文件代码如下:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>json</title>
</head>
<body>

    <?php
    // Nordpool pricelist
    $url1 = 'https://api.energidataservice.dk/dataset/Elspotprices?start=2023-01-22T00%3A00&end=2023-01-23T00%3A00&columns=HourDK%2C%20PriceArea%2C%20SpotPriceDKK&filter=%7B%22PriceArea%22%3A%20%22DK2%22%7D';
    // Grid pricelist
    $url2 = 'https://api.energidataservice.dk/dataset/DatahubPricelist?start=2023-01-22T00%3A00&end=2023-01-23T00%3A00&filter=%7B%22ChargeOwner%22%3A%20%22TREFOR%20El-net%20A%2FS%22%2C%20%22Note%22%3A%20%22Nettarif%20C%20time%22%7D&limit=1&timezone=DK';

    $json1 = file_get_contents($url1);
    $json2 = file_get_contents($url2);
    $json_array1 = json_decode($json1, true);
    $json_array2 = json_decode($json2, true);

    foreach($json_array1 as $key1 => $arrays1){
        
            foreach($arrays1 as $array1){
            echo "<br />";
            print_r(array_values($array1));

        }
            echo "<br />";
    }

    foreach($json_array2 as $key2 => $arrays2){
        
            foreach($arrays2 as $array2){
            echo "<br />";
            print_r(array_values($array2));

        }
            echo "<br />";
    }

    //$result = array_merge($array1, $array2);
    //print_r($result);
    
    //echo $array1, $array2;

    //foreach ($jo as $value) {
    //echo $jo->records;
    //}
    //echo $value, "
";
    //echo var_dump($jo)
    //echo $jo->records;

    // Grid pricelist

    
    /*
    $url2 = 'https://api.energidataservice.dk/dataset/DatahubPricelist?start=2023-01-22T00%3A00&end=2023-01-23T00%3A00&filter=%7B%22ChargeOwner%22%3A%20%22TREFOR%20El-net%20A%2FS%22%2C%20%22Note%22%3A%20%22Nettarif%20C%20time%22%7D&limit=1&timezone=DK';
    $json = file_get_contents($url2);
    $json_array2 = json_decode($json, true);

    foreach($json_array2 as $key => $arrays){
        echo $key . "<br />";
        foreach($arrays as $array){
            echo "<br />";
            foreach($array as $key => $value){
                echo $key . " => " . $value . "<br />";
            }
            echo "<br />";
        }
        echo "<br />";
    }
    */

    /*
    $Price1 * 1.25 * 100 / 100
    $Price2
    $Price3
    $Price4
    $Price5
    $Price6
    $Price7
    $Price8
    $Price9
    $Price10
    $Price11
    $Price12
    $Price13
    $Price14
    $Price15
    $Price16
    $Price17
    $Price18
    $Price19
    $Price20
    $Price21
    $Price22
    $Price23
    $Price24
    */

    
    ?>

</body>
</html>
解决方案

核心思路

两个数据源的结构差异:

  • 数据集1返回24条小时数据,每条包含HourDK、PriceArea、SpotPriceDKK三个字段
  • 数据集2返回1条数据,包含Price1到Price24共24个小时的电网价格字段

我们需要将数据集2的价格字段与数据集1的小时数据一一匹配,合并成目标结构后排序,最后插入数据库。

完整实现代码

<?php
// 读取数据源
$url1 = 'https://api.energidataservice.dk/dataset/Elspotprices?start=2023-01-22T00%3A00&end=2023-01-23T00%3A00&columns=HourDK%2C%20PriceArea%2C%20SpotPriceDKK&filter=%7B%22PriceArea%22%3A%20%22DK2%22%7D';
$url2 = 'https://api.energidataservice.dk/dataset/DatahubPricelist?start=2023-01-22T00%3A00&end=2023-01-23T00%3A00&filter=%7B%22ChargeOwner%22%3A%20%22TREFOR%20El-net%20A%2FS%22%2C%20%22Note%22%3A%20%22Nettarif%20C%20time%22%7D&limit=1&timezone=DK';

// 解析JSON,提取核心数据
$rawData1 = json_decode(file_get_contents($url1), true);
$rawData2 = json_decode(file_get_contents($url2), true);
$hourlyData = $rawData1['records'] ?? [];
$priceList = $rawData2['records'][0] ?? [];

// 合并并整理数据
$mergedResult = [];
foreach ($hourlyData as $index => $item) {
    // 匹配对应小时的Price字段
    $priceKey = 'Price' . ($index + 1);
    // 生成目标结构数组
    $mergedItem = [
        $item['HourDK'],
        $item['PriceArea'],
        $item['SpotPriceDKK'],
        $priceList[$priceKey] ?? null
    ];
    // 用HourDK作为键,方便后续排序
    $mergedResult[$item['HourDK']] = $mergedItem;
}

// 按HourDK时间排序
ksort($mergedResult);
// 转换为索引数组(如需从1开始索引,可改用array_merge([], $mergedResult))
$finalData = array_values($mergedResult);

// 输出测试
echo "<pre>";
print_r($finalData);
echo "</pre>";

// MySQL插入示例(需提前配置数据库连接)
/*
$pdo = new PDO('mysql:host=your_host;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("INSERT INTO your_table (hour_dk, price_area, spot_price_dkk, price) VALUES (?, ?, ?, ?)");
foreach ($finalData as $row) {
    $stmt->execute($row);
}
*/
?>

关键说明

  1. 数据提取:直接定位到JSON中的records字段,跳过无关的元数据
  2. 匹配逻辑:通过遍历索引将数据集1的第N条数据与数据集2的PriceN字段关联
  3. 排序:利用ksort按HourDK字符串排序,保证时间顺序正确
  4. 数据库插入:使用PDO预处理语句,避免SQL注入,提升插入效率

注意事项

  • 若服务器禁用allow_url_fopen,需改用curl读取远程数据
  • 建议添加错误捕获(如判断json_decode结果、网络请求是否成功),避免空数据引发异常
  • 插入数据库时需根据实际表结构调整字段名和数据类型

内容的提问来源于stack exchange,提问作者nhtj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:50