[英]Is there a better way to sort and display an array of dates by day of the week in php?
我目前有一個簡單的調度系統,用戶可以從 20 個不同的時間段進行 select 進行預約。 我想更新它以更好地查看 function,因為它在當前形式下非常簡單。 我的想法是采用當前的迭代,並根據一組可用約會(其中有超過 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>';
};
?>
不確定這是否是您要查找的內容,但您可以將第一個數組 map 放入一個關聯數組中,該數組將日期作為鍵,並將另一個可用時間數組作為值。
要做到這一點,你可以這樣:
$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 循環中,您可以在當天 output ,在第二個或內部循環中,您可以擁有當天的每個可用小時。 如果您需要將它放在單獨的元素中,則需要運行兩個單獨的循環,一個用於在選項卡中輸出日期,第二個用於在下面的部分中輸出小時。
編輯:較舊的 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>';
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.