【问题标题】:Opening hours in array from monday to sunday, sort it from today instead of monday周一到周日的营业时间数组,从今天开始排序而不是周一
【发布时间】:2020-06-27 21:59:13
【问题描述】:

我似乎有一个问题,了解如何按照我想要的方式对数组进行排序。

目前我的数组是这样的,每个索引代表从星期一开始的一个工作日。

Array
(
    [0] => 08:00-18:00 // monday
    [1] => 08:00-18:00 // tuesday
    [2] => 08:00-18:00 // wednesday
    [3] => 08:00-18:00 // thursday
    [4] => 08:00-18:00 // friday
    [5] => 10:00-14:00 // saturday
    [6] => 10:00-14:00 // sunday
)

假设今天是星期六,我需要数组看起来像这样

Array
(
    [0] => 10:00-14:00 // saturday
    [1] => 10:00-14:00 // sunday
    [2] => 08:00-18:00 // monday
    [3] => 08:00-18:00 // tuesday
    [4] => 08:00-18:00 // wednesday
    [5] => 08:00-18:00 // thursday
    [6] => 08:00-18:00 // friday
)

我想要的是显示今天的营业时间。

谢谢。

【问题讨论】:

  • 你放弃了吗?

标签: php arrays date


【解决方案1】:

以下逻辑可能与您要完成的工作非常吻合:

<?php

$arr = ["08:00-18:00", "08:00-18:00", "08:00-18:00", "08:00-18:00", "08:00-18:00", "10:00-14:00", "10:00-14:00",
];
// rework $arr - give it days as keys
$dow = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
foreach ($arr as $key => $value) {
    $arr[$dow[$key]] = $value;
    unset($arr[$key]);
}

// rotate array
$day = 'saturday'; // start array with saturday
$shift = array_search($day, $dow);
$arr = array_merge(array_slice($arr, $shift, NULL, true), array_slice($arr, 0, $shift, true));

注意:执行旋转魔术的漂亮单线来自:https://www.php.net/manual/en/ref.array.php#105907

工作demo

【讨论】:

    【解决方案2】:

    您可以使用 PHP date() 函数来获取当前星期几(0=星期日,6=星期六)。您可以将当前数组调整为从周日到周六运行,也可以在从数组中获取元素时调整数组元素#。

    date("w") 将返回星期几。

    有关 PHP date() 函数的完整说明,请参阅此文档...

    https://www.w3schools.com/php/func_date_date.asp

    【讨论】:

      【解决方案3】:

      这很有趣,稍微创造性地使用 2 个 for 循环就可以为您做到这一点

      function baseOnDay($day)
      {
          $open = ['08:00-18:00', '08:00-18:00', '08:00-18:00', '08:00-18:00', 
                   '08:00-18:00', '10:00-14:00', '10:00-14:00'
                  ];
          $days = ['monday','tuesday','wednesday','thursday',
                  'friday', 'saturday', 'sunday'
                  ];
          $day = strtolower($day);
          if (!in_array($day, $days)) {
              return false;   // passed a silly param
          }
          
          $newOpen = [];
          $start = array_search($day, $days);
          for ($i=$start; $i<count($open); $i++){
              $newOpen[] = $open[$i];
          }
          for ($i=0; $i<$start; $i++){
              $newOpen[] = $open[$i];
          }
          return $newOpen;
      }
      
      if ( ($openTimes = baseOnDay('saturday')) !== false ){
          print_r($openTimes);
      } else {
          echo 'Bad Parameter';
      }
      

      结果

      Array
      (
          [0] => 10:00-14:00
          [1] => 10:00-14:00
          [2] => 08:00-18:00
          [3] => 08:00-18:00
          [4] => 08:00-18:00
          [5] => 08:00-18:00
          [6] => 08:00-18:00
      )
      

      【讨论】:

      • 听起来好像他想显示从当天开始的营业时间。如果您从周日到周六创建该数组,则可以使用 date("w") 自动返回该数组而无需任何输入与 date("w") 函数具有相同的相关性。这样,用户可以传入 date("w") 的值或不同的开始日期。
      【解决方案4】:

      如果您的数组始终是星期一到星期日并且索引为 0 到 6,那么只需将您想要的数组提取到末尾并将其添加到剩余内容的开头即可。星期六是 5 点,所以将其删除到最后:

      $result = array_merge(array_splice($array, 5), $array);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        相关资源
        最近更新 更多