【问题标题】:Sort array of days from a specific start date从特定开始日期对天数进行排序
【发布时间】:2019-03-07 12:39:32
【问题描述】:

我有这个随机排列的天数:

$jour_planning[] = "friday";
$jour_planning[] = "wednesday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";
$jour_planning[] = "thursday";
$jour_planning[] = "sunday";
$jour_planning[] = "saturday";

如果我们今天是“星期二”,我想拥有这个新数组:

$jour_planning[] = "wednesday";
$jour_planning[] = "thursday";
$jour_planning[] = "friday";
$jour_planning[] = "saturday";
$jour_planning[] = "sunday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";

如何使用 usort() 做到这一点?

问候, 维尼

【问题讨论】:

  • 您可以使用array_shiftarray_push 来完成。
  • 是的^或者今天找到然后拼接前后数组并合并

标签: php arrays sorting days


【解决方案1】:

我会先对数组进行排序(并避免使用法语和英语命名:))。

然后,将排序后的数组循环并存储到 2 中,将预期的数组(包括这个)前几天和之后的几天分开。

最后,合并两个数组。

当然有更好的方法来做到这一点。

$jour_planning[] = "friday";
$jour_planning[] = "wednesday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";
$jour_planning[] = "thursday";
$jour_planning[] = "sunday";
$jour_planning[] = "saturday";

$sorted_days_planning = array(1 => null, 2 => null, 3 => null, 4 => null, 5 => null, 6 => null, 7 => null);

foreach ($jour_planning as $value)
{
    $day_of_week = date('N', strtotime($value));
    $sorted_days_planning[$day_of_week] = $value;
}

$final_days_planning = array();

$day_to_start = "tuesday";
$day_found = false;
$temp_array = array();
foreach ($sorted_days_planning as $value)
{
    if (!$day_found)
    {
        $temp_array[] = $value;
        if ($day_to_start == $value)
            $day_found = true;
    }
    else
        $final_days_planning[] = $value;
}

$final_days_planning = array_merge($final_days_planning, $temp_array);

var_dump($final_days_planning);

输出:

array(6) {
    [0]=> string(9) "wednesday"
    [1]=> string(8) "thursday"
    [2]=> string(6) "friday"
    [3]=> string(8) "saturday"
    [4]=> string(6) "sunday"
    [5]=> string(6) "monday"
    [6]=> string(7) "tuesday"
}

【讨论】:

    【解决方案2】:

    您可以使用uksort()date()strtotime() 重新排列您的数组。

    function sort_week_days( $t1, $t2 ) {
            $weekdays = array( 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' );
            foreach ( $weekdays as $key => $value ) {
                $weekdays[ $key ] = date( 'w', strtotime( $value ) );
            }
    
            $t1_time = date( 'w', strtotime( strtolower( $t1 ) ) );
            $t2_time = date( 'w', strtotime( strtolower( $t2 ) ) );
    
            return array_search( $t1_time, $weekdays ) - array_search( $t2_time, $weekdays );
        }
    

    你需要传递你的随机数组如下:

    usort($jour_planning, "sort_week_days");
    

    然后你可以在下面的代码中使用你的数组:

    $day = date('w'); // You need to change to date('w', '-1day'); get result from today.
    
    for ($i=0; $i <= $day ; $i++) {
       array_push($jour_planning, array_shift($jour_planning));
    }   
    

    【讨论】:

    • 很好,它正在工作。如果我希望数组与今天在同一天开始呢?
    • @via 你需要加$day = date('w', '-1day');
    • 嗯,我试了几个数组,这个不工作,你知道为什么吗? $jour_planning[] = "星期三"; $jour_planning[] = "星期四"; $jour_planning[] = "星期五"; $jour_planning[] = "星期六"; $jour_planning[] = "星期天";
    • @Via 因为 MondayTuesday 缺少您的数组。
    • @Via 根据您的问题,我已经回答了您的需求。如果您有任何其他问题,您需要单独提出问题。
    【解决方案3】:

    由于您的数组是随机排序的,因此没有其他方法可以正确排序,然后手动进行(您不能按数字或字母顺序排列数组 - 可以通过 datetime() 函数计算天数来完成,见@Cid's答案),所以:

    /*
    $jour_planning = [];
    
    $jour_planning[] = "friday";
    $jour_planning[] = "wednesday";
    $jour_planning[] = "monday";
    $jour_planning[] = "tuesday";
    $jour_planning[] = "thursday";
    $jour_planning[] = "sunday";
    $jour_planning[] = "saturday";
    */
    
    $days = [
        0 => 'monday',
        1 => 'tuesday',
        2 => 'wednesday',
        3 => 'thursday',
        4 => 'friday',
        5 => 'saturday',
        6 => 'sunday'
    ];
    
    $today = array_search(strtolower(date('l')), $days);
    $tomorrow = ($today === 6) ? 0 : $today + 1;
    $reordered = array_merge(array_slice($days, $tomorrow), array_slice($days, 0, $tomorrow));
    
    print_r($reordered);
    

    首先你必须搜索当天,然后将这一天的索引加1,你就有了今天,那就是明天。现在,当您拥有此索引时,您只需创建 2 个数组:第一个从明天开始,第二个从索引 0 开始到今天。然后将这两个数组合并在一起,你就得到了你想要的。

    【讨论】:

    • 您可以订购。检查我的答案。
    • @Cid 是的,你可以通过每天计算日期来订购它,当然这样会有更多的性能成本。
    【解决方案4】:

    您可以使用此功能对工作日进行排序,并且可以选择包括第一天。

    function sort_days($day_to_start = 'monday', $include_first_day = true)
    {
        $final_days_planning = [];
        $rest_days = [];
        $first_day_found = 0;
        foreach ([ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ] as $day)
        {
            if (!$first_day_found){
                if ($day_to_start == $day){
                    $first_day_found = 1;
                    if($include_first_day){
                        $final_days_planning[] = $day;
                    }
                    else
                    {
                        $rest_days[] = $day;
                    }
                }
                else
                {
                    $rest_days[] = $day;
                }
            } else{
                $final_days_planning[] = $day;
            }
        }
        return array_merge($final_days_planning, $rest_days);
    }
    

    尝试一下:

    $days = sort_days('wednesday');
    print_r($days);
    

    【讨论】:

      【解决方案5】:

      您可以使用 in_array 查找数组中存在的日期并添加到新数组中。

      $jour_planning=["saturday","wednesday","friday","thursday"];
      
      public function getSortedDays($jour_planning){     
          $sorted_days=[];   
          for($i=1;$i<=7;$i++){
              $day = date("l", strtotime("+$i days"));
              $_day = strtolower($day);
              if(in_array($_day, $jour_planning)){
                  $sorted_days[] = $_day;
              }
          }
          return $sorted_days;
      }
      
      $sorted_days = getSortedDays($jour_planning);
      
      print_r($sorted_days); //Array ( [0] => wednesday [1] => thursday [2] => friday [3] => saturday )
      

      【讨论】:

        【解决方案6】:
            while (end($jour_planning) !== "tuesday") {
                array_unshift($jour_planning, array_pop($jour_planning));
            }
        

        【讨论】:

        • 这个解决方案只会移动当前数组,不会重新排序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        • 2014-03-11
        • 1970-01-01
        • 2021-08-24
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多