2012-04-02 18 views
0

Also habe ich ein Array, das 6 Variablen in sich hat, die ich gegeneinander überprüfen muss .. um festzustellen, was zu dem Skript aufrufen die Funktion aufrufen .. Alle Felder sind des Typs datetime aus der Datenbank, aus der sie abgeleitet sind.Array gegen einander zu überprüfen, um die Antwort zu bestimmen

die Felder: in1out1in2out2in3out3

Array:

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 
) 

die Antwort:

clocked_in oder clocked_out

Was muss ich fig ure geführt wird, um zu bestimmen, der beste Weg, wenn der Benutzer durch Prüfen oder getaktet gegen diese Anordnung getaktet wird ..

so, wenn in1, out1 und in2 nicht NULL sind dann würde der Benutzer in getaktet werden .. wenn in1 ist nicht NULL, aber out1 ist NULL dann würde der Benutzer ausgetaktet werden, etc .. Wer hat irgendwelche Ideen auf den einfachsten Weg, um dies ohne zu viele if-Anweisungen zu erreichen?

[Was hat funktioniert]

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

Weitere Informationen dazu, wie genau jedes der Felder ausgefüllt wird, wären hilfreich. – mdarwi

+0

zunächst in der DB sieht es so aus: 2012-04-02 10.00.00 \t NULL \t NULL \t NULL \t NULL \t NULL – Johnny

Antwort

1

Was sollten Sie tun, ist es, sie als Paare zu behandeln. Sie sollten Ihr Array zweimal nacheinander durchsehen, um zu sehen, ob die Uhr gesetzt ist, und wenn ja, ist der Takt eingestellt. Aktualisieren Sie eine Variable auf dem Weg, um sicherzustellen, dass.

$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; 

Es ist irgendwie rau wie ich dies ziemlich schnell geschrieben. Ich entschuldige mich, wenn es Syntaxfehler gibt, aber das ist das Grundkonzept, das ich verwenden würde.

+0

Gute Idee, aber wird nicht funktionieren .. Array sieht aus wie: 'array (in1 = > date, out1 => datum, in2 => datum, out2 => datum, in3 => datum, out3 => datum) 'where datum ist entweder ein gültiges datetime oder NULL – Johnny

+0

dein code verwirrte mich nur ein bisschen. .. aber ich habe es umstrukturiert, und es funktionierte perfekt .. Code ist in meinem OP .. – Johnny

+0

Ah yea, ich habe nicht realisiert, Sie hatten "in1" und der Rest als Ihre Array-Schlüssel. Schön, dass es für dich geklappt hat. –

0

Vielleicht eine Lösung auf dem Schemaebene ist; Sie können die Datenbank ändern ein Aktivitätsprotokoll sein, sondern eine konkrete Reihe von Säulen mit:

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 

(die Kürze vergeben)

Jetzt können Sie eine beliebige Anzahl von Takt- unterstützen In/Out-Ereignisse, wenn sich die Anforderungen ändern.

Um den Status eines Benutzers zu ermitteln, wählen Sie einfach den Datensatz für den jüngsten Vorfall aus und überprüfen das Feld Type.

Sie können auf Anwendungsebene validieren, so dass, wenn der zuletzt aufgetretene Zustand IN ist, Sie nur OUT einfügen können und umgekehrt.

einen Trigger Auto Verwenden Sie bevölkern die DATETIME Feld, oder verwenden Sie TIMESTAMP mit CURRENT_TIMESTAMP als Standard (obwohl ich die Besonderheiten dieser vergessen)

+0

möglich, aber dies würde erfordern neu schreiben die meisten der gesamten Anwendung ein Problem von beheben immer den richtigen Knopf zeigend .. also danke für die Eingabe, aber es ist nicht plausibel. – Johnny

+0

@Johnny Kein Problem; Ich dachte mir, dass Sie das Schema möglicherweise nicht ändern können, da andere Teile Ihrer Anwendung davon abhängig sind. Aber es lohnt sich, sie zu machen :) – Dan

1

Hier ist eine stilvolle Art und Weise tun, ohne Nester:

# 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); 
} 

Theorie dahinter ist, dass Anzahl der Null-Felder von array_intersect zurückgegeben wird; Danach finden Sie heraus, dass die Zahl gerade oder ungerade ist, was den getakteten/ausgehenden Zustand impliziert. Beispiel verwendet "t", um einen Nicht-Null-Wert anzugeben, aber es soll ein Zeichenfolge-Zeitstempel sein.

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

Das ist ein sehr stilvoller und möglicher Weg, es zu tun ... Ich muss es vielleicht ausprobieren .. – Johnny

+1

Oh, nette Verwendung der array_intersect. Ich mag diese Lösung. –

Verwandte Themen