PHP:某些时间/日期值未被标记为冲突(但大多数其他值都是)

时间:2015-11-04 19:01:35

标签: php date time conflict

要点:

我的应用程序在页面上有很多复选框。 用户选择他们想要的任何复选框,然后点击提交。

我需要做一些冲突检查。

我目前的代码状态非常好......但是我发现它的逻辑存在缺陷,允许某些选择'在没有被注意到冲突的情况下通过。 (但我不明白为什么他们会过去,也不知道如何解决它)

技术概述:

我获取了一系列提交的控件/元素,并循环执行每个控件/元素:

1。)checkStartFirst()=查看首先开始的内容并安排两次'的顺序。作为参数发送到另一个函数(isConflict())

2。)isConflict()=获取传递给它的参数。并检查参数X的开始时间是否大于参数Y的结束时间。 然后我将这些值推送到另一个数组中以便稍后使用。

3.。)上述循环完成后...我有另一个函数清除数组中的任何重复数据并将其传回我需要的地方(用于前端突出显示所述冲突)

调试输出中的一个有问题的选项,它们滑过并且没有被标记为冲突,(其他相同的日期/时间选择被标记为冲突)

  

发送:hours_9_7_reg_session_101_945_1005 /   hours_9_7_reg_session_102_945_1005

     

收到检查:hours_9_7_reg_session_101_945_1005 /   hours_9_7_reg_session_102_945_1005

     

B:检查:hours_9_7_reg_session_102_945_1005 [end:09/07/2015   10:05]> hours_9_7_reg_session_101_945_1005 [start:09/07/2015 9:45]

由于它处于循环中,因此会再次检查(其他方式)

  

发送:hours_9_7_reg_session_102_925_945 /   hours_9_7_reg_session_101_945_1005

     

收到检查:hours_9_7_reg_session_102_925_945 /   hours_9_7_reg_session_101_945_1005

     

答:检查:hours_9_7_reg_session_102_925_945 [end:09/07/2015 9:45]>    hours_9_7_reg_session_101_945_1005 [start:09/07/2015 9:45]

(再次滑过)

我的PHP函数..从调用setConflicts()

开始
//new (proposed) session conflicts checker
function checkStartFirst($cf_presX, $cf_presY) {                         
    //$cf_presX['fullStart'] < $cf_presY['fullStart'] ? $this->isConflict($cf_presX, $cf_presY) : $this->isConflict($cf_presY, $cf_presX);

    echo 'Received for checking: '. $cf_presX['id'] . '  /  ' . $cf_presY['id'] .'<br>';
    if($cf_presX['fullStart'] < $cf_presY['fullStart']){
        echo 'A: ';
        $this->isConflict($cf_presX, $cf_presY);        
    }else{
        echo 'B: ';
        $this->isConflict($cf_presY, $cf_presX);        
    }   
}

function isConflict ($cc_presX, $cc_presY) {      
    echo 'CHECKING:  ' . $cc_presX['id'] .' [end: ' . $cc_presX['fullEnd'] . ']     >     ' . $cc_presY['id'] .'  [start: ' . $cc_presY['fullStart'] . ']';
    if ($cc_presX['fullEnd'] > $cc_presY['fullStart']) {    
        echo '  --   has conflict <br>';            
        array_push($this->conflict_output, $cc_presX['id']);
        array_push($this->conflict_output, $cc_presY['id']);
        //echo 'Found Conflict: ' . $cc_presX['id'] . '  /  ' . $cc_presY['id'] . '<br>';
    }else{
        //only here for debugging readability
        echo '<br>';
    }
}

function setConflicts() {
    $presentations = $this->conflict_list;  
    for ($i = 0; $i < count($presentations); $i++) {
        for ($j = 0; $j < count($presentations); $j++) {
            // if it is not the same event
            if ($presentations[$i]['id'] != $presentations[$j]['id']) {
                echo '<br><br>Sending: '.($presentations[$i]['id'] .'  /  '. $presentations[$j]['id']) .'<br>';
                $this->checkStartFirst($presentations[$i], $presentations[$j]);
            }else{
                echo '<br><br><br>same session, do not check: ' . ($presentations[$i]['id'] .'  /  '. $presentations[$j]['id']) . '<br><br><br>';
            }
        }
    } 
    $this->getConflicts();  
}

function getConflicts(){
    $presentations = $this->conflict_output;
    //remove duplicates in array & re-key (sequentially)
    $uniquePresentations = array_unique($presentations);
    //re-key array using sequential index #'s
    $uniquePresentations = array_values($uniquePresentations);
    if(count($uniquePresentations) > 0){
        //save conflict (names) to array
        $this->conflict_return = $uniquePresentations;
        $this->errmsg = 'Please review the form for errors, there are conflicts in the highlighted sessions below. (Possible duplicate or overlapping session times have been selected.) <br>You can not proceed until all conflicts are resolved.';    
    }       
}

上面的blockquote中的代码/时间选择如何滑过?其他人在哪里被标记?

我不确定是否需要收紧一些条件或什么?

1 个答案:

答案 0 :(得分:0)

解决方案(错误)比我预期的要容易。

基本上我在检查日期/时间戳的任何地方..我需要确保我正在将它们转换/转换为strtotme()值...当从对象/数组中提取值时,它被视为一个字符串。

为什么每隔一次冲突检查工作没有问题..我不知道。 LOL

但这样做解决了我的问题:

if(strtotime($cf_presX['fullStart']) < strtotime($cf_presY['fullStart'])){


if (strtotime($cc_presX['fullEnd']) > strtotime($cc_presY['fullStart'])) {