Php 如何将两个数据库表转换为多维JSON文件?
上图显示了我的MYSQL数据库中的两个表;一张桌子上有设施,另一张桌子上有这些设施的开放时间。当然,实际上我的数据库中有很多记录,但结构是一样的 我想把每个“设施”都变成谷歌地图上的一个标记。标记应包含有关设施的一些信息。为此,我需要使用PHP创建数据的JSON表示。JSON文件将使用JQUERY获取。过去几天我一直在努力解决的问题是将两个表中的数据合并到一个多维JSON文件中,如下所示 我如何合并PHP中的两个数组(或者MYSQL中的两个表,如果这是我应该做的),以获得下面的JSON文件Php 如何将两个数据库表转换为多维JSON文件?,php,mysql,json,Php,Mysql,Json,上图显示了我的MYSQL数据库中的两个表;一张桌子上有设施,另一张桌子上有这些设施的开放时间。当然,实际上我的数据库中有很多记录,但结构是一样的 我想把每个“设施”都变成谷歌地图上的一个标记。标记应包含有关设施的一些信息。为此,我需要使用PHP创建数据的JSON表示。JSON文件将使用JQUERY获取。过去几天我一直在努力解决的问题是将两个表中的数据合并到一个多维JSON文件中,如下所示 我如何合并PHP中的两个数组(或者MYSQL中的两个表,如果这是我应该做的),以获得下面的JSON文件
[{
"id": "1",
"name": "Facility One",
"city": "Texas",
"postalCode": "34928",
"postalCity": "Texas",
"streetAdress": "Big Street 82",
"phone": "555-948 342",
"website": "www.facilityone.com",
"lat": "32.329484",
"lng": "87.027483",
"openHours": [{
"weekday": "1",
"open": "06:00:00",
"close": "22:00:00"
}, {
"weekday": "2",
"open": "06:00:00",
"close": "22:00:00"
}, {
"weekday": "3",
"open": "06:00:00",
"close": "22:00:00"
}, {
"weekday": "4",
"open": "06:00:00",
"close": "22:00:00"
}, {
"weekday": "5",
"open": "06:00:00",
"close": "22:00:00"
}, {
"weekday": "6",
"open": "08:00:00",
"close": "20:00:00"
}, {
"weekday": "7",
"open": "10:00:00",
"close": "20:00:00"
}]
}, {
"id": "2",
"name": "Facility Two",
"city": "Chicago",
"postalCode": "49384",
"postalCity": "Chicago",
"streetAdress": "Small Street 48",
"phone": "555-329 094",
"website": "www.facilitytwo.com",
"lat": "59.928384",
"lng": "95.293875",
"openHours": [{
"weekday": "1",
"open": "07:30:00",
"close": "22:00:00"
}, {
"weekday": "2",
"open": "07:30:00",
"close": "22:00:00"
}, {
"weekday": "3",
"open": "07:30:00",
"close": "22:00:00"
}, {
"weekday": "4",
"open": "07:30:00",
"close": "22:00:00"
}, {
"weekday": "5",
"open": "07:30:00",
"close": "22:00:00"
}, {
"weekday": "6",
"open": "09:00:00",
"close": "20:00:00"
}, {
"weekday": "7",
"open": "10:00:00",
"close": "18:00:00"
}]
}]
这可能应该在PHP中完成,但作为一个有趣的挑战(我很无聊),我想我尝试在纯MySQL中完成
SET SESSION group_concat_max_len = 10000000;
SELECT CONCAT('[{',
GROUP_CONCAT(CONCAT(
'"id": "',id,'",',
'"name": "',name,'",',
'"city": "',city,'",',
'"postalCode": "',postalCode,'",',
'"postalCity": "',postalCity,'",',
'"streetAdress": "',streetAddress,'",',
'"phone": "',phone,'",',
'"website": "',website,'",',
'"lat": "',lat,'",',
'"lng": "',lng,'",',
T.openHours
)
ORDER BY id ASC SEPARATOR '}, {'
),'}]'
) as JSON
FROM facilities f
INNER JOIN
(SELECT facility,
CONCAT('"openHours": [{',
GROUP_CONCAT(
CONCAT('"weekday": "',weekday,'",',
'"open": "',openHour,'",',
'"close": "',closeHour,'"'
)
ORDER BY weekday asc SEPARATOR '}, {'
),
'}]'
) as openHours
FROM facility_openhours
GROUP BY facility
)as T
ON f.id = T.facility
sqlfiddle输出:
[{“id”:“1”,“name”:“Facility One”,“city”:“Texas”,“postalCode”:“34928”,“postalCity”:“Texas”,“StreetAddress”:“Big Street 82”,“phone”:“555-948 342”,“website”:“www.facilityone.com”,“lat”:“32.329484”,“lng”:“87.027483”,“开放时间”:[{“工作日”:“1”,“开放时间”:“06:00:00”,“关闭时间”:“22:00”},{“工作日”:“2”,“开放时间”:“06:00:00:00”,“关闭时间”:“22:00:00”},{“工作日”:“3”,“开放”:“06:00:00”,“关闭”:“22:00:00”},{“工作日”:“4”,“开放”:“06:00:00”,“关闭”:“22:00:00”},{“工作日”:“5”,“开放”:“06:00:00”,“关闭”:“22:00:00”},{“工作日”:“6”,“开放”:“08:00:00”,“关闭”:“20:00”},{“工作日”:“7”,“开放”:“10:00:00”,“关闭”:“20:00:00”},{“2”,“设施名称”:“{”“芝加哥”、“postalCode”:“49384”、“postalCity”:“芝加哥”、“街道服饰”:“小街48”、“电话”:“555-329094”、“网站”:“www.facilitytwo.com”、“lat”:“59.928384”、“lng”:“95.293875”、“开放时间”:[{“工作日”:“1”、“开放时间”:“07:30:00”、“关闭时间”:“22:00:00”}、{“工作日”:“2”、“开放时间”:“07:30:00”、“关闭时间”:“22:00”}、{“工作日”:“3”、“开放时间”:“07:30:00”关闭:{22:00:00},{“工作日”:“4”,“打开”:“07:30:00”,“关闭”:“22:00”},{“工作日”:“5”,“打开”:“07:30:00”,“关闭”:“22:00:00”},{“工作日”:“6”,“打开”:“09:00:00”,“关闭”:“20:00:00”},{“工作日”:“7”,“打开”:“10:00:00”,“关闭”:“18:00:00”}]
db.php
,它用
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
然后在我的所有页面上都包含db.php
<?php include 'db.php';?>
<?php
$sql = "SELECT id,name,city,postalcode,postalcity,streetaddress,phone,website,lat,lng,";
$sql .= "facility,weekday,openhour as `open`,closehour as `close` ";
$sql .= "FROM facilities f INNER JOIN facility_openhours fo ON fo.facility = f.id ";
$sql .= "ORDER BY f.id ASC, fo.weekday ASC";
$stmt = $conn->prepare($sql);
$facilities = array();
if ($stmt->execute()) {
while ($row = $stmt->fetch()) {
$weekday = intval($row['weekday']);
// if it's weekday 1, we set up our array
if ($weekday == 1){
$openHours = array();
}
$single_day = array("weekday" => $row['weekday'],
"open" => $row['open'],
"close" => $row['close']
);
// add this single day to our openHours array
array_push($openHours, $single_day);
if ($weekday == 7){
$facility = array("id" => $row['id'],
"name" => $row['name'],
"city" => $row['city'],
"postalCode" => $row['postalcode'],
"postalCity" => $row['postalcity'],
"streetAddress" => $row['streetaddress'],
"phone" => $row['phone'],
"website" => $row['website'],
"lat" => $row['lat'],
"lng" => $row['lng'],
"openHours" => $openHours
);
// add this facility to facilities
array_push($facilities, $facility);
}
}
}
$my_json = json_encode($facilities);
echo $my_json;
?>
谢谢你们的建议,伙计们!我真的很感激他们。这就是我想要的解决方案:
$result1=mysqli_query($conn,$sql1);
$MainArray = array();
$Facilities = array();
$OpeningHours = array();
while ($row1=mysqli_fetch_assoc($result1)) {
$Facilities['FacilityId'] = $row1['FacilityId'];
$Facilities['FacilityName'] = $row1['FacilityName'];
$Facilities['FacilityCity'] = $row1['FacilityCity'];
$Facilities['FacilityPostalCode'] = $row1['FacilityPostalCode'];
$Facilities['FacilityPostalCity'] = $row1['FacilityPostalCity'];
$Facilities['FacilityStreetAddress'] = $row1['FacilityStreetAddress'];
$Facilities['FacilityPhoneNumber'] = $row1['FacilityPhoneNumber'];
$Facilities['FacilityWebsite'] = $row1['FacilityWebsite'];
$Facilities['lat'] = $row1['lat'];
$Facilities['lng'] = $row1['lng'];
$Facilities['OpeningHours'] = array();
$sql2 = "SELECT * FROM OpeningHours WHERE OpeningHoursFacility = " .$row1['FacilityId']."";
$result2=mysqli_query($conn,$sql2);
while ($row2=mysqli_fetch_assoc($result2)) {
$OpeningHours['OpeningHoursWeekday'] = $row2['OpeningHoursWeekday'];
$OpeningHours['OpeningHour'] = $row2['OpeningHour'];
$OpeningHours['ClosingHour'] = $row2['ClosingHour'];
array_push($Facilities['OpeningHours'],$OpeningHours);
}
array_push($MainArray,$Facilities);
}
$jsonData = json_encode(array('Facilities' => $MainArray), JSON_PRETTY_PRINT);
echo $jsonData;
您需要2个查询。首先获取id为json的设施。其次检索openhours。完成后,将其添加到第一个json中。如何在PHP中将openhours json添加到设施json中,以使最终结果看起来像我问题中的json?感谢您的建议。我现在一直在使用它,但appa我没有权限设置group_concat_max_len,因此我的JSON最终被切断。我想用PHP实现这一点,如果有人能告诉我我将非常感激。请查看我的PHP答案,并让我知道这是否对YouTunk的@Tin Tran有效!在你的答案中有一些方法我不熟悉。我使用了另一种方法解决方案(见下文)。您的方法似乎要执行多个查询…每个设施一个查询。我的方法只是排队等待开放时间,然后每当到达第7天,它就会添加设施,因为此时7天的所有开放时间都存在。