Ergebnis 1 bis 13 von 13

Thema: PHP Daten in einem Tag auf Überschneidung prüfien und dementsprechend anzeigen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Kapsel deinen Code weiter in Funktionen. Hab keine Scheu kleine Funktionen zu schreiben.
    Für start und end kannst auch gleich DateTime Objekte erstellen. Dann sparst du dir das ganze rumkonvertiere.

    Außerdem ist das Ergebnis von 0 doch richtig mit deinen Testdaten und es fehlt ein return in deiner Funktion.

  2. #2
    Wenn ich
    Code:
    count($overlap);
    anwende, zeigt er 0 0 0 0 0 0
    an.
    Die IDs haben aber einen Wert, der nicht 0 ist.
    Zitat Zitat
    Für start und end kannst auch gleich DateTime Objekte erstellen. Dann sparst du dir das ganze rumkonvertiere.
    Alles Klar

    €dit:
    Ok, die ganze Sache mit assoziativen Arrays verwirrt mich.
    Code:
    foreach($overlap as $key => $value)
    			{
    				echo $key;
    				echo $value;
    			}
    gibt aber auch nichts aus...

    Geändert von Raildex (18.06.2014 um 17:07 Uhr)

  3. #3
    Drei Fehler:
    1. Erst mal hast du bei deiner if-Abfrage bei $task2->start vergessen den Formatstring mitzugeben.
    2. Der Formatstring für die Uhrzeit muss H:i:s lauten.

    Korrigierst du diese beiden Fehler, dann wirst du auch ein Ergebnis bekommen, welches aber noch falsch ist, denn:

    3. Du testest die IDs nicht auf Gleichheit. Das sorgt dafür, dass er eine Task mit sich selbst überprüft.

    Edit:
    Ich würde den Code aber auch so in etwas aufteilen:

    Code:
    function getOverlaps(DateTime $date,array $tasks)
    {
    	$result = array();
    	$tasksOfThisDay = getTasksOfDate($date, $tasks);
    	
    	foreach ($tasksOfThisDay as $task1) 
    	{
    		foreach ($tasksOfThisDay as $task2) 
    		{
    			if (isOverlay($task1, $task2)) 
    			{
    				$array = array($task1->id, $task2->id);
    				sort($array);
    				if (!in_array($array, $result)) $result[] = $array;
    			}
    		}
    	}
    	
    	return $result;
    }
    
    function getTasksOfDate(DateTime $date, array $tasks)
    {
    	$result = array();
    	foreach($tasks as $task)
    	{
    		if($task->start->format('Y-m-d') == $date->format('Y-m-d'))
    		{
    			$result[] = $task;
    		}
    	}
    	
    	return $result;
    }
    
    function isOverlay(stdClass $task1, stdClass $task2)
    {
    	return  ($task1->id != $task2->id)
    			&& ($task1->start->format('H:i:s') < $task2->end->format('H:i:s')) 
    			&& ($task1->start->format('H:i:s') >= $task2->start->format('H:i:s'));
    }
    Meine php Kenntnisse sind aber auch sehr eingerostet. Vermutlich geht der Code noch hübscher. Ich hab schon seit etlichen Jahren nichts mit mit php am Hut gehabt.

    Geändert von Whiz-zarD (18.06.2014 um 19:54 Uhr)

  4. #4
    Puh, vielen Dank!

    Ich habe mich im Übrigen für deine Variante entschieden, allein weil es wirklich schöner ist, wenn die Daten genauer angezeigt werden.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •