如何将两个数据库表转换为多维JSON文件?

时间:2016-04-24 00:12:58

标签: php mysql json

tables in MYSQL

上图显示了我的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"
    }]
}]

3 个答案:

答案 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

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
$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;