簡體   English   中英

有沒有更好的方法在 php 中按星期幾排序和顯示日期數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM