我有一个多维数组,我想将其插入到 mysql 数据库中。一切正常,但我想要一个更好的解决方案,因为行在嵌套数组后重复
这是我的 json
{
"results": [
{
"id": 48728,
"name": "MOVIES AT THE PARK @ GIBA GORGE",
"url": "Some URL",
"imageUrl": "Some Path",
"dateCreated": "2018-06-08T09:18:59.717",
"lastModified": "2018-06-26T14:20:45.0214921",
"startDate": "2018-07-28T17:00:00",
"endDate": "2018-07-28T22:00:00",
"venue": {
"id": 0,
"name": "Giba Gorge Mountain Bike Park",
"addressLine1": "110 Stockville Road",
"addressLine2": "",
"latitude": -29.8276051,
"longitude": 30.781735700000013
},
"locality": {
"levelOne": "South Africa",
"levelTwo": "KwaZulu-Natal",
"levelThree": "Clifton Canyon"
},
"organiser": {
"id": 0,
"name": "Ultra Glow SA ",
"phone": "0822603351",
"mobile": "0828927837",
"facebookUrl": "",
"twitterHandle": "",
"hashTag": "UGMOVIES",
"organiserPageUrl": "some url"
},
"categories": [
{
"id": 3,
"name": "Film & Media"
},
{
"id": 12,
"name": "Food & Drink"
}
],
"tickets": [
{
"id": 98655,
"name": "ADULT TICKET",
"soldOut": false,
"provisionallySoldOut": false,
"price": 100,
"salesStart": "2018-06-26T11:52:00",
"salesEnd": "2018-07-28T17:00:00",
"description": "",
"donation": false,
"vendorTicket": false
},
{
"id": 98656,
"name": "UNDER 12",
"soldOut": false,
"provisionallySoldOut": false,
"price": 80,
"salesStart": "2018-06-26T11:53:00",
"salesEnd": "2018-07-28T17:00:00",
"description": "",
"donation": false,
"vendorTicket": false
}
],
"schedules": [
],
"refundFeePayableBy": 0
},
{
"id": 51681,
"name": "ULTRA GLOW COLOUR CRUZ @ RIETVLEI ZOO FARM",
"url": "some url",
"imageUrl": "some path",
"dateCreated": "2018-06-26T12:12:07.3",
"lastModified": "2018-06-28T15:22:24.1579751",
"startDate": "2018-08-12T10:00:00",
"endDate": "2018-08-12T14:00:00",
"venue": {
"id": 0,
"name": "Rietvlei Zoo Farm",
"addressLine1": "101 Swartkoppies Road",
"addressLine2": "",
"latitude": -26.3117147,
"longitude": 28.07989120000002
},
"locality": {
"levelOne": "South Africa",
"levelTwo": "Gauteng",
"levelThree": "Johannesburg South"
},
"organiser": {
"id": 0,
"name": " Ultra Glow South Africa",
"phone": "0822603351",
"mobile": "0828927837",
"facebookUrl": "",
"twitterHandle": "",
"hashTag": "",
"organiserPageUrl": "some url"
},
"categories": [
{
"id": 60,
"name": "Trail Running"
},
{
"id": 5,
"name": "Sports & Fitness"
}
],
"tickets": [
{
"id": 98735,
"name": "ADULT EARLY BIRD",
"soldOut": false,
"provisionallySoldOut": false,
"price": 150,
"salesStart": "2018-06-26T12:47:00",
"salesEnd": "2018-08-12T10:00:00",
"description": "",
"donation": false,
"vendorTicket": false
},
{
"id": 98736,
"name": "UNDER 12 - EARLY BIRD",
"soldOut": false,
"provisionallySoldOut": false,
"price": 120,
"salesStart": "2018-06-26T12:47:00",
"salesEnd": "2018-08-12T10:00:00",
"description": "",
"donation": false,
"vendorTicket": false
}
],
"schedules": [
],
"refundFeePayableBy": 0
}
],
"pageSize": 10,
"pages": 1,
"records": 2,
"extras": null,
"message": null,
"statusCode": 0
}
我尝试了以下代码将相关数据插入数据库
<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];
$n= sizeof($results);
for($i=0;$i<$n;$i++){
$row=$results[$i];
foreach($row['tickets'] as $key => $value){
$sql="INSERT into
event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketNa me,price)
VALUES('".$row["name"]."','".$row["url"]."','".$row["imageUrl"]."','".$row["dateCreated"]."','".$row["venue"]["name"]."','".$row["venue"]["addressLine1"]."','".$row["venue"]["addressLine2"]."','".$value["name"]."','".$value["price"]."')";
mysqli_query($connect,$sql);
}
}
echo "events data inserted";
?>
这会将相应的数据输入到我的数据库中,但由于嵌套数组 tickets
具有相应的键 name
和 price
,因此正在发生相同的事件在我的数据库中发布了两次,例如 MOVIES AT THE PARK @ GIBA GORGE
的价格 100
是一行,MOVIES AT THE PARK @ GIBA GORGE
的价格为价格 80
在另一行...我将来必须将这些数据显示为一个事件名称的一部分,并将其门票类型和价格作为表格...您对其他任何想法有什么想法我可以让它变得更好,而不是为相同的事件设置两行吗?
提前致谢
对于那些建议我不要使用 for 和 foreach 循环的人,这是我删除 for 循环和单个 foreach 循环后的更新代码,它给了我一个错误:票证下的名称和价格未定义索引
<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];
foreach($results as $key => $result){
$sql="INSERT into `event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketName,price) VALUES('".$result["name"]."','".$result["url"]."','".$result["imageUrl"]."','".$result["dateCreated"]."','".$result["venue"]["name"]."','".$result["venue"]["addressLine1"]."','".$result["venue"]["addressLine2"]."','".$result["tickets"]["name"]."','".$result["tickets"]["price"]."')";`
mysqli_query($connect,$sql);
}
echo "events data inserted";
?>
因此,我通过使用两个 foreach 循环进一步更新了我的代码,一个循环遍历顶级数组“结果”,另一个循环遍历嵌套数组“门票”
<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];
foreach($results as $key => $result){
foreach($result["tickets"] as $k => $v){
$sql="INSERT into event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketName,price) VALUES('".$result["name"]."','".$result["url"]."','".$result["imageUrl"]."','".$result["dateCreated"]."','".$result["venue"]["name"]."','".$result["venue"]["addressLine1"]."','".$result["venue"]["addressLine2"]."','".$v["name"]."','".$v["price"]."')";`
mysqli_query($connect,$sql);
}
}
echo "events data inserted";
?>
它迭代嵌套数组,所以我的代码没有任何问题,现在唯一的问题是我的 table 上有 2 个事件,因为“tickets”数组中有两种门票类型成人和 child
因此,根据这里的许多建议,我需要为事件和门票创建两个单独的表,如果有人能告诉我如何连接这两个表以便能够在 html 中显示带有门票类型的事件信息,我将不胜感激价格显示在 html 表格标签中,提前致谢
最佳答案
发生这种情况的主要原因是看下面的代码:
$row=$results[$i];
foreach($row['tickets'] as $key => $value){
$sql="INSERT into event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketNa me,price) VALUES('".$row["name"]."','".$row["url"]."','".$row["imageUrl"]."','".$row["dateCreated]."','".$row["venue"]["name"]."','".$row["venue"]["addressLine1"]."','".$row["venue"]["addressLine2"]."','".$value["name"]."','".$value["price"]."')";
mysqli_query($connect,$sql);
}
$row
包含您的一个主要条目,$row['tickets']
包含 2 个条目,并且您正在循环中使用 $row 主要内容来获取票据。这就是您获得 2 个条目的原因。解决这个问题的最佳方法是使用单个 foreach 循环,而不是使用 for 和 foreach。
编辑:
实际上,我想建议通过将其分成 2 个表来标准化您的表,一个用于存储事件信息,另一个用于使用门票信息。参见下面的结构:
event(id,name,url,imageUrl,addressLine1,addressLine2,dateCreated);
event_tickets(id,event_id,ticketName,price,dateCreated);
这将帮助您轻松维护信息。您也可以将代码修改为如下所示:
$sql="INSERT into event(name,url,imageUrl,addressLine1,addressLine,2dateCreated) VALUES ('".$row['name']."','".$row['url']."','".$row['imageUrl']."','".$row['venue']['addressLine1']."','".$row['venue']['addressLine2']."','".date('Y-m-d h:i:s')."');"
mysqli_query($connect, $sql);
$event_id = mysqli_insert_id($connect);
然后您可以使用 foreach 将票证信息插入到 event_tickets 表中。
希望这有帮助
关于php - 如何将多维数组的嵌套数组插入到mysql中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149612/