php - 有没有更好的方法在php中按星期几排序和显示日期数组?
问题描述
我目前有一个简单的调度系统,用户可以从 20 个不同的时间段中选择进行预约。我想更新它以使其外观和功能更好,因为它在当前形式下非常简单。我的想法是采用当前的迭代,并根据一组可用约会(其中有超过 20 个,但我只显示 20 个)中保存的数据动态更新约会的日期。
我的问题是我已经花了一些时间来解决这个问题,并且我开始意识到我正在编写很多代码来可能以更简单的方式完成。现在,我编写的代码查看数组的当前位置(因为索引 0 可能没有任何内容,因为它不是可用的时间段),然后循环查找要显示的第二天。这行得通,但我不确定如何获取与该日期相关的值。
该数组包含如下所示的日期/时间: 2020-07-27 17:00:00
请参阅我之前和之后的屏幕截图,了解我正在尝试做的事情以获得更多说明:
所以我试图从日期按降序排列的两列中取出它,以一种更有吸引力和易于阅读的方式显示可用时间段(和所有日期)。
任何帮助将非常感激!
代码:
<?php
//Get value of first entry (not necessarily index 0 since its been cleaned to remove unavailable dates)
$firstEntryValue = current($program_final);
//Convert date to day of the week
$dayOfWeek = date("l", strtotime($firstEntryValue));
//Output for verification
echo '<p>';
print_r($dayOfWeek);
echo '</p>';
//Set to null for first instance
$nextDay = $dayOfWeek;
//Find next day - 1
do {
$nextDate = next($program_final);
$nextDay = date("l", strtotime($nextDate));
} while ($nextDay == $dayOfWeek);
//Set
$dayOfWeek = $nextDay;
//Output of Next day
echo '<p>';
print_r($nextDay);
echo '</p>';
//Set
$dayOfWeek = $nextDay;
//Find next day - 2
do {
$nextDate = next($program_final);
$nextDay = date("l", strtotime($nextDate));
} while ($nextDay == $dayOfWeek);
//Output of Next day
echo '<p>';
print_r($nextDay);
echo '</p>';
//Set
$dayOfWeek = $nextDay;
//Loop for appointment display
foreach (array_slice($program_final, 0, 10) as &$value) {
echo '<div class="large-6 cell">';
echo '<div class="grid-x align-center grid-padding-x align-middle">'
echo '<div class="auto shrink cell">';
echo '<input name="apptime" value="' . date("Y-m-d H:i:s", strtotime($value)) . '" type="radio" required>';
echo '</div>';
echo '<div class="auto cell">';
echo '<p style="text-transform: uppercase;">'. date("M j Y, g:i A", strtotime($value)) .'</p>';
echo '</div>';
echo '</div>';
echo '</div>';
};
?>
解决方案
不确定这是否是您要查找的内容,但您可以将第一个数组映射到一个关联数组,该数组将日期作为键,并将另一个可用时间数组作为值。
要做到这一点,你可以这样:
$program_final = ['2020-07-27 17:00:00', '2020-07-27 18:00:00'];
$dates = [];
/**
* Transforms from the ['2020-07-27 17:00:00', '2020-07-27 18:00:00', ...] format to
* the ['2020-07-27' => ['17:00:00', '18:00:00', '20:00:00'], '2020-07-29' => ['19:00:00']]
*/
foreach ($program_final as $value) {
[$date, $hour] = explode(" ", $value);
if (!isset($dates[$date])) {
$dates[$date] = [];
}
$dates[$date][] = $hour;
}
foreach ($dates as $date => $hours) {
print_r(date("l", strtotime($date)));
foreach($hours as $hour) {
$date_val = strtotime($date . ' ' . $hour);
echo '<div class="large-6 cell">';
echo '<div class="grid-x align-center grid-padding-x align-middle">';
echo '<div class="auto shrink cell">';
echo '<input name="apptime" value="' . date("Y-m-d H:i:s", $date_val) . '" type="radio" required>';
echo '</div>';
echo '<div class="auto cell">';
echo '<p style="text-transform: uppercase;">'. date("M j Y, g:i A", $date_val) .'</p>';
echo '</div>';
echo '</div>';
echo '</div>';
}
};
这样,在第一个 for 循环中,您可以输出当天,而在第二个或内部循环中,您可以获得当天的每个可用小时。如果您需要将它放在单独的元素中,则需要运行两个单独的循环,一个用于在选项卡中输出日期,第二个用于在下面的部分中输出小时。
编辑: 较旧的 PHP 版本兼容代码:
<?php
$program_final = ['2020-07-27 17:00:00', '2020-07-27 18:00:00'];
$dates = [];
/**
* Transforms from the ['2020-07-27 17:00:00', '2020-07-27 18:00:00', ...] format to
* the ['2020-07-27' => ['17:00:00', '18:00:00', '20:00:00'], '2020-07-29' => ['19:00:00']]
*/
foreach ($program_final as $value) {
$splitted = explode(" ", $value);
$date = $splitted[0];
$hour = $splitted[1];
if (!isset($dates[$date])) {
$dates[$date] = [];
}
$dates[$date][] = $hour;
}
foreach ($dates as $date => $hours) {
print_r(date("l", strtotime($date)));
foreach($hours as $hour) {
$date_val = strtotime($date . ' ' . $hour);
echo '<div class="large-6 cell">';
echo '<div class="grid-x align-center grid-padding-x align-middle">';
echo '<div class="auto shrink cell">';
echo '<input name="apptime" value="' . date("Y-m-d H:i:s", $date_val) . '" type="radio" required>';
echo '</div>';
echo '<div class="auto cell">';
echo '<p style="text-transform: uppercase;">'. date("M j Y, g:i A", $date_val) .'</p>';
echo '</div>';
echo '</div>';
echo '</div>';
}
};
推荐阅读
- sql - 使用 ASP.NET 到数据库的 JSON 对象
- c++ - 添加存储在向量中的大整数的函数的问题
- java - Hateoas 链接在查询参数之间的链接中颠倒了“&”
- git - 如何以编程方式确定较早或较晚的提交?
- bitbucket - 通过 API 合并 bitbucket 拉取请求
- maven - 使用 Maven 导入 PDF
- c - DPDK 创建一个数据包进行传输
- xml - XSLT - XSLT 处理器如何匹配模板
- c# - 在 C# 中,可以访问和更改 Windows 消息泵以响应 WM_GETOBJECT 吗?
- amazon-web-services - 使用 Lambda 从 AWS IoT 到 DynamoDB