2012-04-02 1 views
0

Итак, у меня есть массив, который имеет 6 переменных в нем, которые мне нужно проверять друг на друга .., чтобы определить, что нужно вернуть скрипту, вызывающему функцию. типа datetime из базы данных, из которой они получены.проверить массив друг на друга, чтобы определить ответ

поля: in1out1in2out2in3out3

Массив:

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, тогда пользователь будет синхронизирован и т. Д. У кого-нибудь есть идеи относительно самого простого способа добиться этого без слишком больших утверждений?

[РАБОТАЛО ЧТО]

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

Дополнительная информация о том, как точно заполняется каждый из полей, будет полезной. – mdarwi

+0

Первоначально в БД выглядит следующим образом: 2012-04-02 10:00:00 \t NULL NULL \t \t NULL NULL \t \t NULL – Johnny

ответ

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; 

Его вроде грубо, как я написал это довольно быстро. Приносим извинения, если есть синтаксические ошибки, но это базовая концепция, которую я бы использовал.

+0

Приятная идея, но не будет работать. Массив выглядит так: 'array (in1 = > date, out1 => date, in2 => date, out2 => date, in3 => date, out3 => date) 'где' date' является либо действительным дата-временем, либо NULL – Johnny

+0

, ваш код немного смутил меня. .. но я реорганизовал его, и он отлично работал .. код в моем OP .. – Johnny

+0

Ах да, я не понимал, что у вас есть «in1», а остальное - как клавиши вашего массива. Рад, что это сработало для вас. –

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 

(прощает краткость)

Теперь вы можете поддерживать произвольное количество часовой in/out, в случае изменения требований к событию.

Поиск состояния пользователя - это просто выбор самой последней записи о вступлении и проверка поля Type.

Вы можете проверить на уровне приложения так, что если последнее состояние вхождения - IN, вы можете вставить только OUT и наоборот.

использовать триггер для автоматического заполнения DATETIME поля или использовать TIMESTAMP с CURRENT_TIMESTAMP как по умолчанию (, хотя я забыл специфику этого)

+0

возможно, но это потребует переписывания большую часть всего приложения, чтобы исправить одну проблему всегда отображая правую кнопку. Так что спасибо за вход, но это не правдоподобно. – Johnny

+0

@Johnny Нет проблем; Я решил, что вы не сможете изменить схему, если другие части вашего приложения зависят от нее, но это стоит того, чтобы сделать :) – Dan

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; после этого вы обнаружите, что число четное или нечетное, что подразумевает состояние clocked-in/out. В примере используется «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 
+0

Это очень стильный и возможный способ сделать это ... Мне, возможно, придется попробовать. – Johnny

+1

О, приятное использование array_intersect. Мне нравится это решение. –

Смежные вопросы