上图显示了我的MYSQL数据库中的两个表;一张桌子有设施,另一张桌子有这些设施的开放时间。当然,实际上我的数据库中有更多的记录,但结构是相同的。
我想转动每个"设施"在Google地图上的标记中。标记应包含有关设施的一些信息。为此,我需要使用PHP创建数据的JSON表示。将使用JQUERY获取JSON文件。我在过去几天遇到的问题是将两个表中的数据合并到一个多维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"
}]
}]
答案 0 :(得分:1)
这应该可以在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","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"}]}]
答案 1 :(得分:0)
这是一个可能的php解决方案。
我有一个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;
?>
答案 2 :(得分:0)
感谢您的建议!我真的很感激他们。这是我的解决方案:
$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;