php - PHP foreach 循环在重叠日期时间上出现问题

标签 php mysql loops foreach

数据摘要

<小时/>

我有以下数据:现有事件的 $existing_events 数组和新事件的请求($requested_start$requested_end )。通常从 SQL 中提取,但我在这里使用静态数组复制了该问题:

$existing_events = array(
    0   => array(
        'time_start' => '2015-09-05 11:30:00',
        'time_end'   => '2015-09-05 18:45:00'
    ),
    1   => array(
        'time_start' => '2015-09-05 07:15:00',
        'time_end'   => '2015-09-05 10:30:00'
    )
);

$requested_start    =   strtotime('2015-09-05 3:30:00 AM');
$requested_end  =   strtotime('2015-09-05 9:30:00 AM');

结果数组

<小时/>

一个 $results 数组,用于跟踪进行比较的次数('comparison_counter')以及发现的冲突数量('conflicts'):

$results = array(
    'conflicts' => 0,
    'comparison_counter' => 0
);

FOREACH 循环

<小时/>

最后,在转储 json_encode 的结果之前,foreach 循环将所请求的新事件的开始和结束时间与每个预先存在的事件的开始和结束时间进行比较,使用 this logic 。请注意 comparison_counter 和conflict 增量 - 前者在每次循环运行时运行,而后者仅在其 if 语句中“达到”,当两者之间存在冲突时请求的事件时间和当前正在测试的事件时间。

if (!empty($existing_events)){
    foreach ($existing_events as $existing_event){
        $existing_start = strtotime($existing_event['time_start']);
        $existing_end = strtotime($existing_event['time_end']);
        $results['comparison_counter']++;
        if ($requested_start > $existing_end) {
            break;
        } elseif ($requested_end < $existing_start) {
            break;
        } else {
            $results["conflicts"]++;
        }
    }
}

echo json_encode($results);
exit;

实际响应

<小时/>

尽管我的 $existing_events 数组中有两项,但我收到的信息却显示 foreach 循环只执行一次。以下是我收到的上述数据:

comparison_counter: 1
conflicts: 0

对比我的期望:

comparison_counter: 2
conflicts: 1

奇怪的是,一旦我对 11:30 开始时间进行以下更改(试图与两个事件重叠):

$requested_end  =   strtotime('2015-09-05 11:30:00 AM');

...comparison_counter 现在可以工作了。我现在收到以下信息:

comparison_counter: 2
conflicts: 2

我的问题

<小时/>

根据我传递的数组中的内容,为什么 foreach 循环无法正常运行?我希望它每次触发时至少都能达到 $results['comparison_counter']++;

最佳答案

我想这可能就是您正在寻找的:

if (!empty($results['same_day'])){
    foreach ($results['same_day'] as $same_day){
        $exist_start = strtotime($same_day->time_start);
        $exist_end = strtotime($same_day->time_end);
        // Check if new meeting plans to start during existing meeting
        if ( ($requested_start > $exist_start) && ($requested_start < $exist_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if new meeting plans to end during existing meeting
        if ( ($requested_end > $exist_start) && ($requested_end < $exist_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if existing meeting starts during new meeting
        if ( ($exist_start > $requested_start) && ($exist_start < $requested_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if existing meeting ends during new meeting
        if ( ($exist_end > $requested_start) && ($exist_end < $requested_end) ) {
            $results["conflicts"]++;
            break;
        }
    }
}

我用来测试的完整代码:

<?php

$a = new stdClass();
$b = new stdClass();

$a->time_start = "2015-09-05 11:30:00";
$a->time_end = "2015-09-05 18:45:00";

$b->time_start = "2015-09-05 07:15:00";
$b->time_end = "2015-09-05 10:30:00";

$results['same_day'] = array( $a, $b );
$results['conflicts'] = 0;

$requested_start = strtotime( "2015-09-05 03:00" );
$requested_end = strtotime( "2015-09-05 11:00" );


if (!empty($results['same_day'])){
    foreach ($results['same_day'] as $same_day){
        $exist_start = strtotime($same_day->time_start);
        $exist_end = strtotime($same_day->time_end);
        // Check if new meeting plans to start during existing meeting
        if ( ($requested_start > $exist_start) && ($requested_start < $exist_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if new meeting plans to end during existing meeting
        if ( ($requested_end > $exist_start) && ($requested_end < $exist_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if existing meeting starts during new meeting
        if ( ($exist_start > $requested_start) && ($exist_start < $requested_end) ) {
            $results["conflicts"]++;
            break;
        }
        // Check if existing meeting ends during new meeting
        if ( ($exist_end > $requested_start) && ($exist_end < $requested_end) ) {
            $results["conflicts"]++;
            break;
        }
    }
}

var_dump( $results );

?>

关于php - PHP foreach 循环在重叠日期时间上出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163409/

相关文章:

php - 如何捕获数据库异常而不将其显示到浏览器?

mysql - SQL根据某些数据进行选择

Java for 循环很难理解

c++ - C++中如何判断一个数是否为质数

python - 使用 Google Colab 和 FFmpeg 对同一文件夹中的多个文件进行编码

当提交按钮被禁用时,PHP 重定向不起作用

javascript - 更新多选下拉列表

php - 重新连接 MySQL 服务器已经消失

php - 如何选中/取消选中单个单选按钮

包含文件的PHP文件路径