PHP: Verschachelte Tabelle

Du schuldest mir ein Bier
PHP:
//Testdaten: Simulation der DB-Tabelle-Rückgabe
$jobs[] = array('start' => '00:00', 'end' => '00:05', 'jobId' => 1, 'mo' => 1, 'di' => 1, 'mi' => 0);
$jobs[] = array('start' => '01:35', 'end' => '02:15', 'jobId' => 2, 'mo' => 0, 'di' => 1, 'mi' => 0);
$jobs[] = array('start' => '02:00', 'end' => '06:55', 'jobId' => 3, 'mo' => 0, 'di' => 1, 'mi' => 1);
$jobs[] = array('start' => '12:10', 'end' => '12:25', 'jobId' => 4, 'mo' => 1, 'di' => 0, 'mi' => 0);

//Daten: Pro Tag ein Eintrag. Der Index sind die Spaltennamen der Tageseinträge der Jobs
//TODO: Erweitern bis Sonntag
$days = array('mo' => 'Montag', 'di' => 'Dienstag', 'mi' => 'Mittwoch');

//Uhrzeiten als String zusammenstellen: 00:00 bis 23:55
//Wir können später die Zeiten als Stringvergleich durchführen, da die Zeit in diesem Format sortierbar ist
for($hour = 0; $hour <24; $hour++){
    for($minute = 0; $minute < 60; $minute = $minute + 5){
        $times[] = date('H:i', mktime($hour, $minute));
    }
}

//Ausgabe
echo '<table>';
//Titel-Zeile ausgeben
echo '<tr><th>time</th>';
foreach($days as $dayName){
    echo "<th>{$dayName}</th>";
}
echo '</tr>';
//Pro Uhrzeit eine Zeile
foreach($times as $time){
    echo '<tr>';
    echo "<th>{$time}</th>";
    //Pro Tag eine Spalte
    foreach(array_keys($days) as $dayCode){
        //Alle Jobs auslesen welche an diesem Tag zur angegeben Zeit eingetragen sind
        $actualJobs = array_filter($jobs, create_function('$job', "return \$job['{$dayCode}'] == 1 && \$job['start'] <= '{$time}' && '{$time}' < \$job['end'];"));
        //TODO: hier das Ganze nach Farbe aufbrösmeln und ausgebe
        //TODO: Die Server/Job/Formatierung durchführen
        //TODO: Fehler ausgeben wenn count($actualJobs)>1 ist. Dann hast du überlappende Jobs
            
            //Ich gebs jetzt einfach  mal die jobIds mit Komma getrennt aus
            //Die jobId aus den ausgewählten Jobs auslesen
            $actualJobIds = array_map(create_function('$job', 'return $job["jobId"];'), $actualJobs);        
            //Und ausgeben
            echo '<td>'.implode(', ', $actualJobIds).'</td>';
    }
    echo "</tr>\n";
}
echo '</table>';

Und noch ein Tipp: Lies alle Befehle die du nicht kennst bei php.net nach und versuche zu verstehen was da vor sich geht.
 
danke vielmals, ich habe dies jetzt in mein code genommen.
aber was muss ich den bei $time einsetzten?
und was bei $days, $daycode?
 
Zuletzt bearbeitet:
ich habe php.net nachgeschaut, aber so genau komme ich immer noch nicht draus. bin kein guter PHP Programmierer...
 
Zuletzt bearbeitet:
Bitte den Code formatiert in [PHP]mein Code[/PHP] setzen.
So wie er jetzt da steht kann man das Ding nicht lesen.
Welchen Teil davon hast du nicht verstanden? Ich weigere mich jetzt dein Code zu lesen!

Und noch ein Tipp: Lies alle Befehle die du nicht kennst bei php.net nach und versuche zu verstehen was da vor sich geht.
aber was muss ich den bei $time einsetzten?
Wenn du nicht weisst, was $time ist, dann solltest du die foreach-Schleife in php.net nachlesen.

Mehr gibts dazu nicht mehr zu sagen, ausser einem.
Mein Stundenansatz beträgt 150.- CHF. Betrachte meine Lösung als ein Gratismuster. Lerne daraus.
 
Ich habe es gelesen. also $time, etc ist mir klar, aber die anderen zwei Befehle komm ich auch nach dem php.net nicht draus.

Ich lerne sehr viel davon. Danke vielmals. Ich werde dir etwas geben.
 
Zuletzt bearbeitet:
Du musst mir sicher nix Zahlen. Es war nur angegeben um zu zeigen, dass wich dir nicht alles was es in php.net zum Nachlesen gibt nochmals erkläre.

Bevor du diesen array_map() verstehen kannst, solltest du create_function() nachschauen.
ggf mal mit var_dump() nachschauen wie $actualJobs und $actualJobIds aussehen. Das hilft beim Verstehen.

Nachtrag:
Anstelle des array_map() kann man es auch so schreiben
PHP:
            $actualJobIds=array();
            foreach($actualJobs as $job){
                $actualJobIds[] = $job['jobId'];
            }
 
hm ok,
das gibt beides mal einen leeren array
array(0) { } array(0) ....

create_function habe ich nun auch nachgeschaut.

aber was muss ich noch ändern, bzw. hinzufügen
 
Zuletzt bearbeitet:
Zurück