首页 > 解决方案 > 有没有更好的方法在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>';
};
 ?>

标签: phparrayssorting

解决方案


不确定这是否是您要查找的内容,但您可以将第一个数组映射到一个关联数组,该数组将日期作为键,并将另一个可用时间数组作为值。

要做到这一点,你可以这样:

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

推荐阅读