如何在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); } */ ?>
关键说明
- 数据提取:直接定位到JSON中的
records字段,跳过无关的元数据 - 匹配逻辑:通过遍历索引将数据集1的第N条数据与数据集2的
PriceN字段关联 - 排序:利用
ksort按HourDK字符串排序,保证时间顺序正确 - 数据库插入:使用PDO预处理语句,避免SQL注入,提升插入效率
注意事项
- 若服务器禁用
allow_url_fopen,需改用curl读取远程数据 - 建议添加错误捕获(如判断
json_decode结果、网络请求是否成功),避免空数据引发异常 - 插入数据库时需根据实际表结构调整字段名和数据类型
内容的提问来源于stack exchange,提问作者nhtj
相关产品推荐
相关产品推荐

