【问题标题】:PHP compare current time with times in array and return related valuePHP将当前时间与数组中的时间进行比较并返回相关值
【发布时间】:2021-04-13 11:15:53
【问题描述】:

我需要将当前时间与数组中的时间进行比较,并相应地返回相关值。 所以我有这样的数组:

$class[0]["start"] = 80000;
$class[0]["end"] = 80500;
$class[0]["title"] = "Warmup";

$class[1]["start"] = 80501;
$class[1]["end"] = 85000;
$class[1]["title"] = "1. class";

$class[2]["start"] = 85001;
$class[2]["end"] = 90000;
$class[2]["title"] = "Break";

我需要将它与当前时间进行比较:

$time = (int) date('Gis');

我可以像这样硬编码:

    if($time >= $class[1]["start"] && $time <= $class[1]["end"]) {
        $title = $class[1]["title"];
    } elseif($time >= $class[2]["start"] && $time <= $class[2]["end"]) {
        $title = $class[2]["title"];
etc ...

但我相信有更好的方法来返回类的“标题”,而无需编写数百行 elseif。

有什么想法吗?

感谢

马洛斯

【问题讨论】:

  • 您似乎正在寻找end 大于当前值的第一个值?
  • 是的,这也是一个观点......嗯......现在我找不到任何方法在多数组中搜索它,但我需要一些时间来谷歌它......
  • 当然,我可以根据自己的意愿更改数组,所以也许这会让我更接近......
  • $class 数组上的一个简单的foreach 可以做到这一点。
  • 为什么会比直接循环更优雅?仅仅因为它占用的线路更少?力求清晰高效的代码,而不是单行奇迹。您可以在找到结果后立即跳出循环,而不是使用将遍历整个数组的数组函数。我会编写一个自定义函数来执行此操作并从中返回。

标签: php time compare


【解决方案1】:

你可以这样做..

<?php 
$time = (int) date('Gis');

$class[0]["start"] = 80000;
$class[0]["end"] = 80500;
$class[0]["title"] = "Warmup";

$class[1]["start"] = 80501;
$class[1]["end"] = 85000;
$class[1]["title"] = "1. class";

$class[2]["start"] = 85001;
$class[2]["end"] = 90000;
$class[2]["title"] = "Break";

foreach($class as $val){ 

      if($time >= $val["start"] && $time <= $val["end"]) {
        $title .= $val["title"];
         } 
  }

echo $title;


?>

【讨论】:

    【解决方案2】:

    扩展 El_Vanja 的评论,您可以拆分循环数组并在两个单独的函数中过滤其数据,因此您的代码变得更加稀疏和可读。

    例如,给定您的数组:

    $class = [
    
        [
            "start" => 80000,
            "end"   => 80500,
            "title" => "Warmup",
        ],
    
        [
            "start" => 80501,
            "end"   => 85000,
            "title" => "1. class",
        ],
    
        [
            "start" => 85001,
            "end"   => 90000,
            "title" => "Break",
        ],
    ];
    

    你可以这样做:

    function is_between(int $value, int $low, int $high) {
    
        return ($value >= $low && $value <= $high);
    }
    
    function filter(array $data, int $time) {
    
        foreach ($data as $row) { 
    
            if (is_between($time, $row['start'], $row['end'])) {
    
                return $row;
            }
        }
    }
    

    然后简单地这样称呼它:

    var_dump(filter($class, 80100));
    var_dump(filter($class, 86000));
    var_dump(filter($class, 80600));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多