所以,我有一个数组,其中有6个变量,我需要相互检查..确定返回调用函数的脚本的内容..所有字段都来自datetime
类型它们源自的数据库。
字段:in1
out1
in2
out2
in3
out3
阵列:
Array(
'in1' => '2012-04-02 10:00:00),
`out1` => '2012-04-02 14:00:00`,
`in2` => '2012-04-02 14:30:00`,
`out2` => '2012-04-02 18:00:00`,
`in3` => NULL,
`out3` => NULL
)
回应:
clocked_in
或clocked_out
我需要弄清楚的是,通过检查这个数组确定用户是通过时钟输入还是计时输出的最佳方法。
因此,如果in1
,out1
和in2
不为NULL,则用户将被输入...如果in1
不是NULL但是out1
是NULL然后用户将被计时等等。任何人有任何想法,最简单的方法来实现这一点,没有太多的if语句?
[做了什么]
for ($i=1; $i <= 3; $i++) {
if ($entities["in$i"] != NULL) {
$ents = "clocked_in";
if ($entities["out$i"] != NULL) {
$ents = "clocked_out";
}
if ($entities["out3"] != NULL) {
$ents = "day_done";
}
}
}
答案 0 :(得分:1)
你应该做的是将它们视为成对对待。您应该一次两个循环遍历数组,检查是否设置了时钟输入,如果是,则设置时钟输出。沿途更新变量以确保。
$clocked = '';
for($i=0; $i <= sizeOf($arr); $i+2) // $arr is your array of clock in and outs
{
if(arr[$i] != NULL)
{
// Our Clock In is Not Null and Our Clock Out is.. meaning we're clocked in.
if(arr[$i+1] == NULL) // check clock out
{
$clocked = "clocked in";
break; //Break out so we don't check the other pairs because we know we're clocked in.
}
else //Clock Out Exists, so far we're clocked out.
{
$clocked = "clocked Out"; // We can't break here. There might be more clock in/out pairs left to check.
}//end clock out check
}// end clock in check
}// end for loop
echo $clocked;
有点粗糙,因为我写得很快。如果有任何语法错误,我道歉,但这是我使用的基本概念。
答案 1 :(得分:1)
这是一种更时尚的方式,没有巢:
# the fields as array $a: in1 out1 in2 out2 in3 out3
function is_clocked_in( $a ) {
$c = (count(array_intersect( $a, array(null) ))) % 2;
return( $c ? true : false );
}
这背后的理论是array_intersect返回了多个空字段;之后,您会发现该数字是偶数或奇数,这意味着时钟输入/输出状态。示例使用“t”表示非空值,但它的意思是字符串时间戳。
var_dump( is_clocked_in( array( null, null, null, null, null, null ) ) ); // f
var_dump( is_clocked_in( array( "t", null, null, null, null, null ) ) ); // T
var_dump( is_clocked_in( array( "t", "t", null, null, null, null ) ) ); // f
var_dump( is_clocked_in( array( "t", "t", "t", null, null, null ) ) ); // T
var_dump( is_clocked_in( array( "t", "t", "t", "t", null, null ) ) ); // f
var_dump( is_clocked_in( array( "t", "t", "t", "t", "t", null ) ) ); // T
var_dump( is_clocked_in( array( "t", "t", "t", "t", "t", "t") ) ); // f
答案 2 :(得分:0)
也许解决方案是在架构级别;您可以将数据库修改为活动日志,而不是使用一系列具体的列:
CREATE TABLE IF NOT EXISTS `mydb`.`Occurrence` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`OccurredOn` DATETIME NOT NULL ,
`Type` ENUM('IN','OUT') NOT NULL ,
PRIMARY KEY (`ID`) )
ENGINE = InnoDB
(原谅简洁)
现在,您可以在需求更改时支持任意数量的时钟输入/输出事件。
查找用户的状态只是选择最近的事件记录,并检查Type
字段。
您可以在应用程序级别进行验证,这样如果最近发生的状态为IN
,那么您只能插入OUT
,反之亦然。
使用触发器自动填充DATETIME
字段,或使用TIMESTAMP
CURRENT_TIMESTAMP
作为默认值(虽然我忘记了的具体内容)< / p>