php - 在php中合并数组并保留空值

标签 php mysql arrays database merge

我正在尝试重新使用 PHP,但我真的很挣扎。 我正在构建一个用于预订网球场的预订系统。用户可以查看特定时间的时间以及球场是否被预订。 预订存储在只有两列的 MySQL 表中:日期时间和预订用户的 ID。 我能够像这样检索数据:

    $sth = $this->dbh->prepare('SELECT bookingDate, booked_by FROM Court1 WHERE bookingDate LIKE ?');

    $sth->execute(array("%$time%"));

    // Array to hold the bookings
    $getCourt1 = array();

    //Getting the data from db
    while($r=$sth->fetch()){

            $courtData[0]   = substr($r['bookingDate'], 10, 12);
            $courtData[1]   = $r['booked_by'];

            array_push($getCourt1, $courtData);
    }

我的想法是将检索到的数据与保存可能预订球场的时间的预定义数组“合并”。

    $base = array(array('08:00:00',''), array('09:00:00', ''), array('10:00:00', ''), array('11:00:00', ''), array('12:00:00', ''), array('13:00:00', ''), array('14:00:00', ''), array('15:00:00', ''), array('16:00:00', ''), array('17:00:00', ''), array('18:00:00', ''), array('19:00:00', ''), array('20:00:00', ''));

这样做的原因是,即使尚未预订,我也需要显示可预订的时间。 我尝试了几种方法,但这是我得到的最接近的方法:

    $aCourt1 = array_replace($base, $getCourt1);

合并后的数组返回到 Controller ,该 Controller 构建 html,然后将其作为变量传递到 View ,如下所示:

    $aCourt1 = $booking->showBookings($time);
    $court1 = '
            <tr>
                <td class="courtTime">'.$aCourt1[0][0].'</td>
                <td class="courtBook '.$aCourt1[0][1].'" data-target="#confirmBooking">'.$aCourt1[0][1].'</td>
            </tr>
            <tr>
                <td class="courtTime">'.$aCourt1[1][0].'</td>
                <td class="courtBook '.$aCourt1[1][1].'" data-target="#confirmBooking">'.$aCourt1[1][1].'</td>
            </tr>
            <tr>
                <td class="courtTime">'.$aCourt1[2][0].'</td>
                <td class="courtBook '.$aCourt1[2][1].'" data-target="#confirmBooking">'.$aCourt1[2][1].'</td>
            </tr>
            <tr>
                <td class="courtTime">'.$aCourt1[3][0].'</td>
                <td class="courtBook '.$aCourt1[3][1].'" data-target="#confirmBooking">'.$aCourt1[3][1].'</td>
            </tr><tr>
                <td class="courtTime">'.$aCourt1[4][0].'</td>
                <td class="courtBook '.$aCourt1[4][1].'" data-target="#confirmBooking">'.$aCourt1[4][1].'</td>
            </tr>
            <tr>
                <td class="courtTime">'.$aCourt1[5][0].'</td>
                <td class="courtBook '.$aCourt1[5][1].'" data-target="#confirmBooking">'.$aCourt1[5][1].'</td>
            </tr>';

该表显示得很好,但首先显示特定日期的条目,然后其余时间按时间顺序显示。 我已经尝试了大多数数组函数并使其通过循环工作,但到目前为止我还没有成功。我一定要去某个地方,但不确定在哪里,所以希望有人能给我建议。提前致谢。 PS:我计划使用 bool 值来检查时间段是否已预订,但问题是我试图避免为每天创建完整的时间表,而只使用每个法庭按日期时间索引的一张表。也许有一个更好的方法来拥有一个默认表而不是合并数组??

最佳答案

尝试使用时间作为数组的键,这样您就可以预先填充默认值并使用查询覆盖必要的条目:

$sth = $this->dbh->prepare('SELECT bookingDate, booked_by FROM Court1 WHERE bookingDate LIKE ?');

$sth->execute(array("%$time%"));

// Set defaults
$courtData = array('08:00:00' => '', '09:00:00' =>  '', '10:00:00' =>  '', '11:00:00' =>  '', '12:00:00' =>  '', '13:00:00' =>  '', '14:00:00' =>  '', '15:00:00' =>  '', '16:00:00' =>  '', '17:00:00' =>  '', '18:00:00' =>  '', '19:00:00' =>  '', '20:00:00' =>  '');

//Getting the data from db
while($r=$sth->fetch()){
    $timestamp = strtotime($r['bookingDate'];
    $time = date("H:i:s", $timestamp);
    $courtData[$time] = $r['booked_by'];
}

在你的 Controller 中:

$aCourt1 = $booking->showBookings($time);
$court1 = '';
foreach($aCourt1 as $time => $booker)
{
    $court1 .= '<tr>';
    $court1 .= ' <td class="courtTime">'.$time.'</td>';
    $court1 .= ' <td class="courtBook '.$booker.'" data-target="#confirmBooking">'.$booker.'</td>';
    $court1 .= '</tr>';
}

关于php - 在php中合并数组并保留空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34366666/

相关文章:

php - 如何在 imagestring() 中加载我的自定义字体?

mysql - 等效于 MySQL ON DUPLICATE KEY UPDATE in Sql Server

php - 在 Doctrine2 上有条件地连接表

Javascript数组过滤器使用外部函数结果

javascript - 如何在 Javascript 中有效地合并两个数组?

php - 照明\数据库\QueryException SQLSTATE[42S22] : Column not found: 1054 Unknown column

php - 是否可能有 1 个查询语句

arrays - 字典 [字符串 : [String]] in Swift

PHP foreach 循环使用数组中的值填充下拉列表

JavaScript-jQuery-PHP : Display specific time dynamically in my datetimepicker from the database