Php 如何获取数组中的第一个和最后一个时间序列

Php 如何获取数组中的第一个和最后一个时间序列,php,Php,我一天中有一系列不同的时间,每15分钟一次 Array ( [0] => 12:00am [1] => 12:15am [2] => 12:30am [3] => 12:45am [4] => 1:00am [5] => 1:15am [6] => 1:30am [7] => 1:45am [8] => 2:00am [9] => 3:15am [10] => 3:30am [11] => 3:45am [12] =>

我一天中有一系列不同的时间,每15分钟一次

Array
(
[0] => 12:00am
[1] => 12:15am
[2] => 12:30am
[3] => 12:45am
[4] => 1:00am
[5] => 1:15am
[6] => 1:30am
[7] => 1:45am
[8] => 2:00am
[9] => 3:15am
[10] => 3:30am
[11] => 3:45am
[12] => 4:00am
[13] => 1:00pm
[14] => 1:15pm
[15] => 1:30pm
);
我想做的是,按顺序将它们组合在一起,然后将它们放入另一个数组中

基于上面的数组,我会得到3个新的数组

Array
(
[0] => 12:00am
[1] => 12:15am
[2] => 12:30am
[3] => 12:45am
[4] => 1:00am
[5] => 1:15am
[6] => 1:30am
[7] => 1:45am
[8] => 2:00am
);
12:00是主阵列的开始,2:00am是模式停止的位置,因为下一个是3:15

array
{
[1] => 3:15am
[2] => 3:30am
[3] => 3:45am
[4] => 4:00am
)
3:15am是主阵列中新图案的开始,4:00am是图案停止的地方,依此类推


我一直在尝试通过主阵列进行循环,并存储上一次的时间以匹配当前循环+15分钟,但根本无法使其正常工作,非常感谢任何帮助,谢谢

我制作了一个阵列,将时间分为小时和上午/下午。这是你想要的吗

<?php
$input =
[ 
"12:00am", "12:15am", "12:30am", "12:45am",
"1:00am", "1:15am", "1:30am", "1:45am",
"2:00am", "3:15am", "3:30am", "3:45am",
"4:00am", "1:00pm", "1:15pm", "1:30pm",
];
// Prepare array
$periods = [];

// Loop all times in input
foreach($input as $time) {
    $hour = substr($time, 0, strpos($time, ':'));
    $partOfDay= substr($time, strlen($time) - 2);
    $periods[$hour][$partOfDay][] = $time;
}
var_dump($periods);

我制作了一个数组,将时间分为小时和上午/下午。这是你想要的吗

<?php
$input =
[ 
"12:00am", "12:15am", "12:30am", "12:45am",
"1:00am", "1:15am", "1:30am", "1:45am",
"2:00am", "3:15am", "3:30am", "3:45am",
"4:00am", "1:00pm", "1:15pm", "1:30pm",
];
// Prepare array
$periods = [];

// Loop all times in input
foreach($input as $time) {
    $hour = substr($time, 0, strpos($time, ':'));
    $partOfDay= substr($time, strlen($time) - 2);
    $periods[$hour][$partOfDay][] = $time;
}
var_dump($periods);
谢谢@Wimanicesir

它只是逻辑和增强的代码

<?php
$input = Array
(
"12:00am",
"12:15am",
"12:30am",
"12:45am",
"1:00am",
"1:15am",
"1:30am",
"1:45am",
"2:00am",
"3:15am",
"3:30am",
"3:45am",
"4:00am",
"1:00pm",
"1:15pm",
"1:30pm",
);
$periods = [];
foreach($input as $time) {
    $hour = substr($time, 0, strpos($time, ':'));
    $partOfDay= substr($time, strlen($time) - 2);
    $index = ($hour== "12") ? "0" : floor($hour/2.00001);
    $periods[$index.":".$partOfDay][] = $time;
}
echo "<pre>";
var_dump($periods);
echo "</pre>";
exit();
?>
谢谢你@Wimanicesir

它只是逻辑和增强的代码

<?php
$input = Array
(
"12:00am",
"12:15am",
"12:30am",
"12:45am",
"1:00am",
"1:15am",
"1:30am",
"1:45am",
"2:00am",
"3:15am",
"3:30am",
"3:45am",
"4:00am",
"1:00pm",
"1:15pm",
"1:30pm",
);
$periods = [];
foreach($input as $time) {
    $hour = substr($time, 0, strpos($time, ':'));
    $partOfDay= substr($time, strlen($time) - 2);
    $index = ($hour== "12") ? "0" : floor($hour/2.00001);
    $periods[$index.":".$partOfDay][] = $time;
}
echo "<pre>";
var_dump($periods);
echo "</pre>";
exit();
?>
代码:

代码:


这是一个函数:


这是一个函数:

我使用strotime()将时间转换为unix时间戳,并计算与下一个元素的差异

$arr=['12:00am'、'12:15am'、'12:30am'、'12:45am'、'1:15am'、'1:30am'、'1:45am'、'2:00am'、'3:15am'、'3:30am'、'4:00am'、'1:00pm'、'1:15pm';
$new=[];
$temp=[];
$total=计数($arr);
对于($i=0;$i<$total;$i++){
$k=$i+1;
//900-相差15分钟
如果(isset($arr[$k])&&STROTIME($arr[$k])-STROTIME($arr[$i])==900){
$temp[]=$arr[$i];
}否则{
$temp[]=$arr[$i];
$new[]=$temp;
$temp=[];
}
}
印刷(新);

我使用strotime()将时间转换为unix时间戳,并计算与下一个元素的差异

$arr=['12:00am'、'12:15am'、'12:30am'、'12:45am'、'1:15am'、'1:30am'、'1:45am'、'2:00am'、'3:15am'、'3:30am'、'4:00am'、'1:00pm'、'1:15pm';
$new=[];
$temp=[];
$total=计数($arr);
对于($i=0;$i<$total;$i++){
$k=$i+1;
//900-相差15分钟
如果(isset($arr[$k])&&STROTIME($arr[$k])-STROTIME($arr[$i])==900){
$temp[]=$arr[$i];
}否则{
$temp[]=$arr[$i];
$new[]=$temp;
$temp=[];
}
}
印刷(新);


我真的不明白你从哪里得到凌晨2点或3点15分,你是说我从哪里得到它?也许你应该描述一下你试图使用的模式?另外,在12:00之后,你通常会得到下午1点,不是吗?你是如何决定在凌晨2点分开,然后在凌晨3:15重新开始的模式是,时间每隔15分钟上升一次,所以在循环时,如果前一个元素不是当前元素的-15分钟,则将所有前一个元素保存到单独的数组中,并继续进行其余的操作。我真的不明白你从哪里获得凌晨2点或凌晨3点15分,你是什么意思我从哪里获得它?也许你应该描述你试图使用的模式?另外,在12:00之后,你通常会得到下午1点,不是吗?你是如何决定在凌晨2点分开,然后在凌晨3:15重新开始的模式是,时间每隔15分钟上升一次,所以在循环时,如果前一个元素不是当前元素的-15分钟,则将所有前一个元素保存到单独的数组中,并继续进行其余的操作。抱歉,不是,基于该数组,我希望循环遍历它并创建3个新数组。第一个从12:00am开始到凌晨2:00am结束(15分钟模式停止),第二个从凌晨3:15am开始(新模式开始),到凌晨4:00am结束(模式停止),第三个从下午1:00pm开始(新模式开始)模式是15分钟间隔抱歉,但不是,基于该阵列,我想循环并创建3个新阵列。第一次从12:00am开始到凌晨2:00am结束(15分钟模式停止),第二次从凌晨3:15am开始到凌晨4:00am结束(新模式停止),第三次从下午1:00pm开始到下午1:00pm结束(新模式开始)模式是15分钟间隔我认为这不正确,OP在我的代码下面的注释中阐明,必须拆分的数组的条件是15分钟的间隔。如果超过此值,则应启动一个新阵列。在您的结果中,它分为1:00和1:15。但是,如果您尝试并提到您使用了我的代码(不是很多人这么做:),它会将您的阵列拆分为两个小时的插槽阵列。上午12:00至凌晨2:00和凌晨2:01至凌晨4:00至下午12:00至下午2:00。请不要与输出数组的索引混淆。@Wimanicesir-我同意你的意见,根据你的意见,OP必须生成带有时间值和数组的简单逻辑。我认为这不正确,OP在我的代码下面的注释中澄清了必须拆分的数组的条件是15分钟的间隔。如果超过此值,则应启动一个新阵列。在您的结果中,它分为1:00和1:15。但是,如果您尝试并提到您使用了我的代码(不是很多人这么做:),它会将您的阵列拆分为两个小时的插槽阵列。上午12:00至凌晨2:00和凌晨2:01至凌晨4:00至下午12:00至下午2:00。请不要与输出数组的索引混淆。@Wimanicesir-我同意您的意见,根据您的意见,OP必须生成带有时间值和数组的简单逻辑。
array(3) {
  [0]=>
  array(9) {
    [0]=>
    string(7) "12:00am"
    [1]=>
    string(7) "12:15am"
    [2]=>
    string(7) "12:30am"
    [3]=>
    string(7) "12:45am"
    [4]=>
    string(6) "1:00am"
    [5]=>
    string(6) "1:15am"
    [6]=>
    string(6) "1:30am"
    [7]=>
    string(6) "1:45am"
    [8]=>
    string(6) "2:00am"
  }
  [1]=>
  array(4) {
    [0]=>
    string(6) "3:15am"
    [1]=>
    string(6) "3:30am"
    [2]=>
    string(6) "3:45am"
    [3]=>
    string(6) "4:00am"
  }
  [2]=>
  array(3) {
    [0]=>
    string(6) "1:00pm"
    [1]=>
    string(6) "1:15pm"
    [2]=>
    string(6) "1:30pm"
  }
}
<?php

$input = [
    "12:00am",
    "12:15am",
    "12:30am",
    "12:45am",
    "1:00am",
    "1:15am",
    "1:30am",
    "1:45am",
    "2:00am",
    // gap here
    "3:15am",
    "3:30am",
    "3:45am",
    "4:00am",
    // gap here
    "1:00pm",
    "1:15pm",
    "1:30pm",
];
$period = 15;

$result = split_periods($input, $period);

var_dump($result);

function split_periods($times, $period) {
    $standard_diff = $period * 60;
    $separated = [];
    $last_time = null;
    $n = 0;
    foreach ($times as $time) {
        $current_time = strtotime($time);
        if ($last_time) {
            $diff = $current_time - $last_time;
            if ($diff != $standard_diff) {
                ++$n;
            }
        }
        $separated[$n][] = $time;
        $last_time = $current_time;
    }

    return $separated;
}
$arr = ['12:00am','12:15am','12:30am','12:45am','1:00am','1:15am','1:30am','1:45am','2:00am','3:15am','3:30am','3:45am','4:00am','1:00pm','1:15pm','1:30pm'];
$new = [];
$temp = [];
$total = count($arr);
for($i=0; $i< $total;$i++){
    $k = $i+1;
    //900 - it is 15 mins difference
    if(isset($arr[$k]) && strtotime($arr[$k]) - strtotime($arr[$i]) == 900){
        $temp[] = $arr[$i];
    }else{
        $temp[] = $arr[$i];
        $new[] = $temp;
        $temp = [];
    }
}
print_r($new);