Ist klar, dass du alles doppelt und dreifach bekommst, wenn du die Datenbankabfragen in zwei geschachtelten Schleifen laufen lässt.
Du könntest in einer ersten Datenbankabfrage alle gebuchten Leistungs-IDs des Gastes abfragen un in einem Array sammeln.
Anschließend dann deine Hauptschleife wie gehabt durchlaufen und mit in_array()
prüfen, ob die Leistung gebucht und das checked-Attribut setzen.
Zweite Variante wäre, eine einzige Abfrage durchführen und bereits im SQL die check-Variable setzen. Das könnte so aussehen (ungetestet):
Code:
SELECT l.ZLID, l.Name, l.Gebuer, IF(gl.ZID IS NULL ,"", "checked=\"checked\"")) AS checked
FROM leistungen AS l
LEFT JOIN gast_leistungen AS gl ON(l.ZLID = gl.ZLID AND gl.GID = $gid)