Moin!
warscheinlich hab ich ein dickes Brett vorm Kopf und seh den Wald vor lauter Bäumen nicht mehr. :/
Mutmaßlich. Ich denke aber, dein Problem liegt ganz woanders, als du es derzeit glaubst.
$termine ist ein mehrdimensionales Array, das mit Arrays gefüllt ist, dass die eigentlichen Werte enthält:
Array([0] => Array([t_kunde] => 2 [t_dienstl] => 3,19,12 [t_date] => 1126537000) [1] => Array([t_kunde] => 2 [t_dienstl] => 2,4 [t_date] => 1126517400 ))
Wo kommen diese Werte her? Doch wohl vermutlich aus einer Datenbankabfrage, die früher im Skript durchgeführt wurde. Warum machst du an dieser Stelle keinen JOIN der Dienstleistungs-ID auf den Dienstleistungsnamen? Weil deine Dienstleistungs-ID als kommaseparierte Liste und entgegen sämtlicher vernünftigerweise angwandten Normalisierungsregeln nicht als separate Tabelle angelegt ist - und das verursacht dir schon bei so einer simplen Aufgabe wie dem nachträglichen Zuordnen von ID zu Name Probleme.
foreach($termine as $t) {
$dienst = explode(",", $t['t_dienstl']);while( list ($key, $val) = each($dienst)) {
$query = mysql_query("SELECT d_name FROM dienstleistung WHERE d_id = ".$val."");
Außerdem feuerst du hier in schneller Abfolge für jede im Array enthaltene Dienstleistungs-ID einen kompletten SQL-Request auf die arme Datenbank. Wenn du schon von der nicht optimalen Datenstruktur der dem Array zugrundeliegenden Datenbank nicht wegkommen kannst, dann wäre zumindest an diesem Punkt doch noch heftiger Optimierungsbedarf, und zwar in den Stufen 1 (nur ein Request je Kunde) oder gar 2 (nur ein Request für das gesamte Array).
// echo "key = ".print_r(each($dienst))."<br>";
$test = each ? 'true' : 'false';
true und false sind keine Strings, also auch nicht in Anführungsstriche (egal ob doppelt oder einfach) zu setzen. Das nur so als Nebenbemerkung.
if($test == 'false') {
$dienste .= mysql_result($query, 0, "d_name")."";
// echo "test";
}
else {
$dienste .= mysql_result($query, 0, "d_name")." / ";
}
}$termin .= "</tr>\n<td class='td2' colspan='4'>".date("d.m.Y, G:i", $t['t_date'])." Uhr -> ".$dienste."</td>\n<tr>\n";
reset($dienst);
}
Insgesamt hat dein Codeausschnit eine große Ansammlung von eher suboptimalen Konstruktionen, die die Bewältigung der Aufgabe ziemlich aufwendig machen.
Um mal ein paar alternative Lösungsansätze zusammenzufassen:
1. Die Möglichkeit, schon direkt beim ursprünglichen Query auch den bzw. die Dienstleistungsnamen mit abzufragen, hatte ich oben erwähnt.
2. Wenn das Abfragen der zur ID zugehörigen Dienstleistungsbezeichnung ein häufigerer Vorgang ist, sollte er unbedingt in einer Funktion ausgelagert werden. Das entzerrt einerseits den hier sich offenbarenden Quelltext-Wühlkram, und es trennt auch die Aufgabenbereiche: Innerhalb der Funktion beschäftigt man sich ausschließlich mit der Wandlung der ID in eine Bezeichnung, außerhalb der Funktion ist ausschließlich die Ausgabe der DB-Informationen wichtig.
Das Problem ist jetzt, dass ich den String $dienste so formartieren will, das wenn die letzte Dienstleistung ausgegeben wird, diese OHNE den "Trennslash" dargestellt werden soll.
Dein Programmansatz kann gar nicht funktionieren, weil du die while-Schleife dort installiert hast. Das Innere der while-Schleife wird ausgeführt, wenn der in runden Klammern stehende Ausdruck etwas ergibt, was PHP als true betrachtet. Kommt hingegen etwas heraus, was PHP als false betrachtet, wird die Schleife sofort verlassen, und danach weitergemacht. Mit anderen Worten: Innerhalb der Schleife ist es total sinnlos, abfragen zu wollen, ob dein each false ergeben hat, denn wenn das der Fall wäre, würde die Schleife ja nicht mehr durchlaufen und diese Abfrage nie erreicht werden.
Wie dedlfix schon sagte: implode() ist eine schöne Funktion, welche ein Array mit einem definierbaren String zusammensetzt. Hättest du also ein Array
$dienste = array("Dienst 1", "Dienst 2", "Dienst 23");
würdest du mit
echo implode(" / ",$dienste);
dann die Liste, schön getrennt mit dazwischenliegenden Schrägstrichen, erhalten.
- Sven Rautenberg
My sssignature, my preciousssss!