iCal aus verschiedenen arrays erstellen

barbiturator

Mitglied
Hallo zusammen,

mir kam gestern eine Super-Idee, bei der ich hoffe, dass ich sie mit den nötigen Tipps umsetzen kann.

Ich weiß nun, dank dieser Hilfestellungen, wie ich aus einem hochgeladenen Dienstplan, bestimmte Daten auslesen kann.

Unter anderem, ist dabei diese Ausgabe möglich:

Code:
=== $userTermine ===
Array
(
    [1234] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => UrA
            [07.06.2011] => UrA
            [08.06.2011] => UrA
            [09.06.2011] => UrA
            [10.06.2011] => UrA
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => UrA
            [15.06.2011] => UrA
            [16.06.2011] => UrA
            [17.06.2011] => UrA
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => UrA
            [21.06.2011] => 
            [22.06.2011] => 
            [23.06.2011] => 
            [24.06.2011] => 
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )
 
    [1235] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => 
            [08.06.2011] => 
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => Bo24
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => 
            [22.06.2011] => FW
            [23.06.2011] => 
            [24.06.2011] => FW
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => KTW
            [30.06.2011] => 
        )
 
    [1236] => Array
        (
            [01.06.2011] => BoN
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => 
            [08.06.2011] => 
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => 
            [22.06.2011] => 
            [23.06.2011] => zV
            [24.06.2011] => 
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )
 
    [1237] => Array
        (
            [01.06.2011] => KTW
            [02.06.2011] => 
            [03.06.2011] => KTW
            [04.06.2011] => Bo24
            [05.06.2011] => 
            [06.06.2011] => QM
            [07.06.2011] => 
            [08.06.2011] => Hö 24
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => Hö 24
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => HöT
            [19.06.2011] => 
            [20.06.2011] => KTW
            [21.06.2011] => KTW
            [22.06.2011] => FW
            [23.06.2011] => 
            [24.06.2011] => FW
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )
 
    [1238] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => BoN
            [08.06.2011] => BoT
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => Bo24
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => FW
            [22.06.2011] => 
            [23.06.2011] => 
            [24.06.2011] => BoT
            [25.06.2011] => Bo24
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => BoN
            [29.06.2011] => 
            [30.06.2011] => Bo24
        )
 
)

Ausgegeben wird also die Personalnummer, und die Dienste, die aktuell eingetragen sind. Kann ich mittels dieser Daten, via PHP, eine iCal Datei erstellen lassen?
Ich müsste dann vorher vermutlich die einzelnen Schichten definieren, von wann, bis wann die dauern...
Also: UrA = Urlaub ganztägig, BoT = Tagdienst 07:00 -19:00, Bo24 = 24h Dienst...

Das wäre eine grandiose Vereinfachung und Modernisierung unseres Dienstes.
 
OK, Danke erstmal.
Ich habe mir das sehr umfangreich wirkende Skript iCalcreator nun runtergeladen, und bin auch gewillt mich mittels Denkenin die Lage zu versetzen, es anzuwenden.
Leider scheint es 'too much' zu sein.

Helfen würde mir ein erster Schritt, z.B., dass ich den array auslesen kann, und dann ein Kalender erzeugt wird, der nur die reinen Dienste auswirft.

Also für dieses Beispiel:
Code:
[1235] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => 
            [08.06.2011] => 
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => Bo24
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => 
            [22.06.2011] => FW
            [23.06.2011] => 
            [24.06.2011] => 
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )

Wird diese, oder ähnliche Ausgabe erzeugt:

Code:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:http://www.example.com/1235.ical
METHOD:PUBLISH
BEGIN:VEVENT
UID:461092315540@example.com
SUMMARY:Bo24
CLASS:PUBLIC
DTSTART:20110613T
DTEND:20110613T
DTSTAMP:20110610T125900Z
END:VEVENT
BEGIN:VEVENT
UID:461092315540@example.com
SUMMARY:FW
CLASS:PUBLIC
DTSTART:20110622T
DTEND:20110622T
DTSTAMP:20110610T125900Z
END:VEVENT
END:VCALENDAR

Das Skript, mit dem ich den Dienstplan einlese sieht so aus:
PHP:
<?php 
 
//den tabulator als Trennzeiche definieren
define('C_DELIM', "\t");
 
//Testdaten
$filename = 'Dienstplan.txt';
$selectedSchicht = 'Bo';
 
//Zeilenfilter. Wenn die getrimmte Zeile keine Läng mehr hat - ignorieren
function lineFilter($line){
    return (strlen(trim($line)) > 1);
}
//Die Zeile in die Fleder aufteilen und jedes Feld noch mit trim() auf die wirkliche Grösse kürzen
function explodeLine($line){
    return array_map('trim', explode(C_DELIM, $line));
}
//Analog zu explodeLine. Jedoch wird der Array-Index mit der Heeaderzeile als Keys ergänzt
function explodeLineWithHeader($header, $line){
    $values = explodeLine($line);
    return array_combine($header, $values);
}
 
 
//Datei einlesen
$lines = file($filename);
//Leere Zeilen ausfiltern
$lines = array_filter($lines, 'lineFilter');
 
//Array der Kopfdaten erstellen
$header = explodeLine(array_shift($lines));
 
//Array mit den Aufnahemhäuesern erstellen (key = Kopfdaten)
$aufnahmehaus = explodeLineWithHeader($header, array_shift($lines));
 
//Zur späteren weiterverwednung alle User-Infos sammeln
$userInfos = array();
$userTermine = array();
 
$selected = array();
//Jede Datenzeile durchgehen
foreach($lines as $line){
    //Die Zeile mal in die Fleder aufteilen
    $row = explodeLineWithHeader($header, $line);
    //Die User-Infos extrahieren
    $userInfos[$row['Pers.-Nr.']] = $userInfo = array_slice($row, 0, 3, true);
    //Die Schichtzuteilungen auslesen
    $userTermine[$row['Pers.-Nr.']] = $userTermin = array_slice($row, 3, NULL, true);
    //Jeden Termin prüfen ...
    foreach($userTermin as $termin => $schicht){
        //... ob er mit $selectedSchicht beginnt 
        if(substr($schicht, 0, strlen($selectedSchicht)) == $selectedSchicht){
            //Wenn ja, in den Resultaten-Array schreiben
            $selected[$termin] = array(
                        'user'            => $userInfo['Pers.-Nr.'],
                        'aufnahmehaus'    => $aufnahmehaus[$termin]
            );
 
        }
    }
}
//Sortieren
ksort($selected);
 
echo "=== \$selected ===\n";
print_r($selected);
 
echo "=== \$userInfos ===\n";
print_r($userInfos);
 
echo "=== \$userTermine ===\n";
print_r($userTermine);
 
?>
 
Zurück