更改数组的顺序以匹配一天中的小时数


Change the order of an array to match hours of day

我有一个数组,列出了一天中的所有时间,0-23 如下所示:

[0] = 0  [1] = 1 [2] = 2 .... etc

然后我使用 date('G') 来查找当前小时,例如 17。

我想做的是重新排序我的数组,使其从下一个小时 18 开始,然后是 19、20、21、22、23、0、1、2.. 等

最好的方法是什么? 我正在将此数组提供给显示一段时间内数据的图表,并且按此顺序使用它确实会让事情变得更容易。

这应该有效:

$array = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
for($i = 0; $i < date("G"); $i++)
    array_push($array, array_shift($array));
print_r($array);

假设date("G")为 14,结果将是:

数组(    [0] => 14    [1] => 15    [2] => 16    [3] => 17    [4] => 18    [5] => 19    [6] => 20    [7] => 21    [8] => 22    [9] => 23    [10] => 0    [11] => 1    [12] => 2    [13] => 3    [14] => 4    [15] => 5    [16] => 6    [17] => 7    [18] => 8    [19] => 9    [20] => 10    [21] => 11    [22] => 12    [23] => 13)
function rearrangeHours(&$hours, $hour_key){
  $beforeNow = array_slice($hours,0,$hour_key+1);
  $afterNow = array_slice($hours,$hour_key+1);
  return $hours = array_merge($afterNow, $beforeNow);
}

然后你可以做

$hours = range(0,23);
rearrangeHours($hours, 15);

我用InfiniteIteratorLimitIterator找到了一个很好的解决方案。您无需更改数组。您可以直接使用迭代器。

$array = range(0, 23);
$start = date("G") + 1;
$count = 24;
$infinate = new InfiniteIterator(new ArrayIterator($array));
$limit = new LimitIterator($infinate, $start, $count);

然后,您可以像数组一样使用$limit

foreach ($limit as $value) {
    print($value . PHP_EOL);
}