Php 在过去一小时内循环查看数组结果

Php 在过去一小时内循环查看数组结果,php,Php,我有一个脚本,可以查询API并在最后一天内查找记录 然后我想循环这些结果,在最后一个小时内得到这些结果 有人能解释一下我是怎么做到的吗 这是我的每日结果列表: array(2) { [0]=> array(36) { ["CallRef"]=> string(10) "1234567891" ["CallStartTime"]=> string(8) "08:18:30" } [1]=> array(36) { ["CallRe

我有一个脚本,可以查询API并在最后一天内查找记录

然后我想循环这些结果,在最后一个小时内得到这些结果

有人能解释一下我是怎么做到的吗

这是我的每日结果列表:

array(2) {
  [0]=>
  array(36) {
    ["CallRef"]=> string(10) "1234567891"
    ["CallStartTime"]=> string(8) "08:18:30"
  }
  [1]=>
  array(36) {
    ["CallRef"]=> string(10) "1234567892"
    ["CallStartTime"]=> string(8) "14:04:20"
  }
}
现在是英国的14:40,所以我的脚本应该只抓取数组中的第二项。

这个怎么样

$apiElements = [
    ['CallRef' => '1234567891', 'CallStartTime' => '08:18:30'],
    ['CallRef' => '1234567892', 'CallStartTime' => '14:04:20'],
];

$currentFormatted = (new DateTime())->format('H');
$startOfHour = DateTime::createFromFormat('H:i:s', $currentFormatted . ':00:00');
$endOfHour = DateTime::createFromFormat('H:i:s', $currentFormatted . ':59:59');

$callsInHour = array_filter($apiElements, function($element) use ($startOfHour, $endOfHour) {
    $dt = DateTime::createFromFormat('H:i:s', $element['CallStartTime']);
    return $dt >= $startOfHour && $dt <= $endOfHour; 
});
$apilements=[
['CallRef'=>'1234567891','CallStartTime'=>'08:18:30'],
['CallRef'=>'1234567892','CallStartTime'=>'14:04:20'],
];
$currentFormatted=(new DateTime())->format('H');
$startOfHour=DateTime::createFromFormat('H:i:s',$currentFormatted.':00:00');
$endOfHour=DateTime::createFromFormat('H:i:s',$currentFormatted':59');
$callsInHour=array\u filter($apielments,function($element)use($startOfHour,$endOfHour){
$dt=DateTime::createFromFormat('H:i:s',$element['CallStartTime']);
return$dt>=$startOfHour&$dt这个怎么样

$apiElements = [
    ['CallRef' => '1234567891', 'CallStartTime' => '08:18:30'],
    ['CallRef' => '1234567892', 'CallStartTime' => '14:04:20'],
];

$currentFormatted = (new DateTime())->format('H');
$startOfHour = DateTime::createFromFormat('H:i:s', $currentFormatted . ':00:00');
$endOfHour = DateTime::createFromFormat('H:i:s', $currentFormatted . ':59:59');

$callsInHour = array_filter($apiElements, function($element) use ($startOfHour, $endOfHour) {
    $dt = DateTime::createFromFormat('H:i:s', $element['CallStartTime']);
    return $dt >= $startOfHour && $dt <= $endOfHour; 
});
$apilements=[
['CallRef'=>'1234567891','CallStartTime'=>'08:18:30'],
['CallRef'=>'1234567892','CallStartTime'=>'14:04:20'],
];
$currentFormatted=(new DateTime())->format('H');
$startOfHour=DateTime::createFromFormat('H:i:s',$currentFormatted.':00:00');
$endOfHour=DateTime::createFromFormat('H:i:s',$currentFormatted':59');
$callsInHour=array\u filter($apielments,function($element)use($startOfHour,$endOfHour){
$dt=DateTime::createFromFormat('H:i:s',$element['CallStartTime']);

返回$dt>=$startOfHour&&$dt有多种方法可以执行此操作。您可以从一小时前获取Unix TimesMap:
strotime('-1小时')
。您可以在时间中计算每个
上的时间,并从分解结果中获取第二个结果

foreach ($array as $value){
    $exploded=explode(":",$value['CallStartTime']);
    if(date('H')-1>$exploded[1]){
       //This means it's an hour ago.
    }
}

有多种方法可以做到这一点。您可以从一小时前获取Unix TimesMap:
strotime(“-1小时”)
。您可以在时间中的每个
上计算时间,并从分解结果中获取第二个结果

foreach ($array as $value){
    $exploded=explode(":",$value['CallStartTime']);
    if(date('H')-1>$exploded[1]){
       //This means it's an hour ago.
    }
}

替换
$allResults
并尝试以下操作:

date_default_timezone_set('UTC');
$hourAgo = strtotime(date('H:i:s')) - 3600;
foreach ($allResults as $result){
    if(strtotime($result["CallStartTime"]) > $hourAgo){
        var_dump($result);
    }
}

替换
$allResults
并尝试以下操作:

date_default_timezone_set('UTC');
$hourAgo = strtotime(date('H:i:s')) - 3600;
foreach ($allResults as $result){
    if(strtotime($result["CallStartTime"]) > $hourAgo){
        var_dump($result);
    }
}

更灵活的解决方案:

首先,您需要一个将时间转换为秒的函数

function convertTimeToSeconds($hhmmss)
{
    //correct format if needed
    list($hours, $minutes, $seconds) = explode(':', $hhmmss);
    return $hours * 3600 + $minutes * 60 + $seconds;
}
然后你就可以使用函数了

$now=date('H:i:s');
$nowSeconds=convertTimeToSeconds($now);
$filterFunction=函数($value)使用($nowSeconds){
return($nowSeconds-convertTimeToSeconds($value['CallStartTime'])<3600;//3600秒=小时
};
$filteredList=array\u filter($array,$filterFunction);

总之

更灵活的解决方案:

首先,您需要一个将时间转换为秒的函数

function convertTimeToSeconds($hhmmss)
{
    //correct format if needed
    list($hours, $minutes, $seconds) = explode(':', $hhmmss);
    return $hours * 3600 + $minutes * 60 + $seconds;
}
然后你就可以使用函数了

$now=date('H:i:s');
$nowSeconds=convertTimeToSeconds($now);
$filterFunction=函数($value)使用($nowSeconds){
return($nowSeconds-convertTimeToSeconds($value['CallStartTime'])<3600;//3600秒=小时
};
$filteredList=array\u filter($array,$filterFunction);

总之

我想你有这个
数组

    Array
(
    [0] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 21:04:20
        )

    [1] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 09:08:08
        )

    [2] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 08:11:08
        )

    [3] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 20:59:08
        )

)
所以我试过这个

    <?php

     $arr = array( 
            "0" => array (
               "CallRef" => 1234567892,
               "CallStartTime" => "21:04:20"
            ),

            "1" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "09:08:08"
            ),
            "2" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "08:11:08"
            ),
            "3" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "20:59:08"
            )
         );
         //echo "<pre>";print_r($arr);die;
     date_default_timezone_set('Asia/kolkata');//set your timezone
     $currentTime = date('H:i:s');//getting current time
     $lastHourTime = date('H:i:s', strtotime('-1 hour'));//getting last hour time
     $result = array();
     foreach ($arr as $singlearr){
         if(strtotime($singlearr['CallStartTime']) >= strtotime($lastHourTime) && strtotime($singlearr['CallStartTime']) <= strtotime($currentTime)){
             $result[] = $singlearr;    
         }else{

         }

}
     echo "<pre>";print_r($result);die;//this gives me last hour records only

我想你有这个
数组

    Array
(
    [0] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 21:04:20
        )

    [1] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 09:08:08
        )

    [2] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 08:11:08
        )

    [3] => Array
        (
            [CallRef] => 1234567892
            [CallStartTime] => 20:59:08
        )

)
所以我试过这个

    <?php

     $arr = array( 
            "0" => array (
               "CallRef" => 1234567892,
               "CallStartTime" => "21:04:20"
            ),

            "1" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "09:08:08"
            ),
            "2" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "08:11:08"
            ),
            "3" => array (
                "CallRef" => 1234567892,
               "CallStartTime" => "20:59:08"
            )
         );
         //echo "<pre>";print_r($arr);die;
     date_default_timezone_set('Asia/kolkata');//set your timezone
     $currentTime = date('H:i:s');//getting current time
     $lastHourTime = date('H:i:s', strtotime('-1 hour'));//getting last hour time
     $result = array();
     foreach ($arr as $singlearr){
         if(strtotime($singlearr['CallStartTime']) >= strtotime($lastHourTime) && strtotime($singlearr['CallStartTime']) <= strtotime($currentTime)){
             $result[] = $singlearr;    
         }else{

         }

}
     echo "<pre>";print_r($result);die;//this gives me last hour records only


那么你自己尝试过什么吗?或者你想让我们为你写一个脚本吗?我只是希望在创建
foreach
循环时得到一些指导,以便只查找上个小时的结果。那么你自己尝试过什么吗?或者你想让我们为你写一个脚本吗?我只是希望在创建脚本时得到一些指导
foreach
循环以仅查找上一个小时的结果。非常感谢,Loko-我现在将尝试实现此解决方案。我的一部分还考虑在数据库中填充一个表,并使用类似于
where date>=date_SUB(now(),INTERVAL 1 hour);
的方法获取数据:-)很快会回来的。谢谢。@michaelmcgurk是的,请让我知道当我尝试此操作时,我得到了
警告:非法字符串偏移量'CallStartTime'
@michaelmcgurk如果您放置
if(isset($value['CallStartTime')),该怎么办{
在foreach?@michaelmcgurk因为我看到你对其他人的代码也有问题,并且得到了这个警告,这可能意味着你没有给我们你的确切代码或者输入了一个错别字什么的。试着
var\u dump($value)
在您的foreach中。它会返回什么?非常感谢,Loko-我现在将尝试实现此解决方案。我的一部分还考虑在数据库中填充一个表,并使用类似于
where date>=date_SUB(now(),INTERVAL 1 HOUR);
的方法获取数据:-)很快会回来的。谢谢。@michaelmcgurk是的,请让我知道当我尝试此操作时,我得到了
警告:非法字符串偏移量'CallStartTime'
@michaelmcgurk如果您放置
if(isset($value['CallStartTime')),该怎么办{
在foreach?@michaelmcgurk因为我看到你对其他人的代码也有问题,并且得到了这个警告,这可能意味着你没有给我们你的确切代码或者输入了一个错别字什么的。试着
var\u dump($value);
在您的foreach中。它返回什么?您不总是从API中获取
CallStartTime
吗?检查您的数据并确保数组始终遵循相同的格式;否则,您必须进行一些额外的检查,例如:
isset($element['CallStartTime'))
并正确处理异常,检查该数组包含的内容,以及格式是否始终相同same@michaelmcgurk好了……当然,正如您所看到的,您有一个名为
item
的包装器元素,请确保执行
$element['item']
,否则它将不起作用。您不总是从API获取
调用开始时间
?检查您的数据并确保数组始终遵循相同的格式;否则,您必须进行一些额外的检查,例如:
isset($element['CallStartTime'))
并正确处理异常