0

バックグラウンド

Limesurveyをアプリケーションと統合しています。このアプリケーションでは、新しい調査トークンが Limesurvey データベースに直接追加されます。挿入を行う前に、Limesurvey の特定のトークン セット (validfromvaliduntil属性を含む) が特定の日付範囲 ( ) と交差しないことを確認する必要がありますDateTime

問題

Limesurveys のトークンvalidfromvaliduntil属性は である可能性があるためNULL、 の単純な比較はDateTimeできませんか?

(Limesurveyvalidfrom/validuntil NULL値は「常に」を意味します)

私が持っているもの

Limesurvey 属性があるかどうかをチェックしNULL、必要に応じて交差の計算を返す PHP クラス。

コード: http://phpfiddle.org/main/code/3vp-j3b

(ここで興味深いのは、foreachループ内の34 ~ 70 行目です)

私が尋ねること

比較値が特別な場合、この方法を改善/最適化する方法はありますか?

4

1 に答える 1

1

比較を容易にするために、nullを可能な最初と最後の日付に置き換えることができます。

if (is_null($token['validfrom']) {
    $token_validfrom = new DateTime('0000-01-01 00:00:00');
} else {
    $token_validfrom = new DateTime($token['validfrom']);
}
if (is_null($token['validuntil']) {
    $token_validuntil = new DateTime('9999-12-31 23:23:59');
} else {
    $token_validuntil = new DateTime($token['validuntil']);
}

このように、比較の最後の行だけが必要になります。

return ($validfrom == $token_validfrom) || ($validfrom > $token_validfrom ? $validfrom < $token_validuntil : $token_validfrom < $validuntil);
于 2013-03-07T10:08:06.897 に答える