Umsetzung: viele Begriffe aus Datenbank in Text mit Platzhalter integrieren
Korbinian
- datenbank
- php
Eine Frage zur Umsetzung.
Ich habe einen langen Text der immer gleich bleibt, in diesem werden nur bestimmte Daten eingesetzt. Ich lese aus meiner mysql Datenbank die Daten...
stadt
anzahl-gef
anzahl-ins
weibl-in
man-ins
...
die dann in folgenden Text eingesetzt werden sollen.
In {stadt} gibt es {anzahl-gef} Gefängnisse. In diesen sitzen zur Zeit {anzahl-ins} Gefangene ein. Davon wiederum sind {weibl-ins} weiblich und {man-ins} männlich.
Ich denke das einfachste wäre den Text in einem String einlesen und dann einzeln die einzelnen Platzhalter austauschen. Oder gibt es eine elegantere einfachere Lösung.
@@Korbinian
$stadt = 'Ankh-Morpork';
$anzahlGef = 3;
$anzahlIns = 42;
$weiblIns = 21;
$manIns = 21;
$template = 'In %1$s gibt es %2$d Gefängnisse. In diesen sitzen zur Zeit %3$d Gefangene ein. Davon wiederum sind %4$d weiblich und %5$d männlich.';
$ausgabe = sprintf($template, $stadt, $anzahlGef, $anzahlIns, $weiblIns, $manIns);
LLAP 🖖
Hello,
$stadt = 'Ankh-Morpork'; $anzahlGef = 3; $anzahlIns = 42; $weiblIns = 21; $manIns = 21; $template = 'In %1$s gibt es %2$d Gefängnisse. In diesen sitzen zur Zeit %3$d Gefangene ein. Davon wiederum sind %4$d weiblich und %5$d männlich.'; $ausgabe = sprintf($template, $stadt, $anzahlGef, $anzahlIns, $weiblIns, $manIns);
Nur mal ganz dumm gefragt:
wie lautet denn hier die zugehörige Kontextbehandlung für das Template?
Liebe Grüße
Tom S.
@@TS
Nur mal ganz dumm gefragt:
wie lautet denn hier die zugehörige Kontextbehandlung für das Template?
Für das Template? Weiß nicht, was du damit meinst.
Oder meinst du: für die Ausgabe? Dann: Je nach Kontext.
LLAP 🖖
Tach!
wie lautet denn hier die zugehörige Kontextbehandlung für das Template?
Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten. Die Behandlung kann aber am besten bei den Parametern für das sprintf() hinzugefügt werden.
dedlfix.
Hello,
wie lautet denn hier die zugehörige Kontextbehandlung für das Template?
Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten. Die Behandlung kann aber am besten bei den Parametern für das sprintf() hinzugefügt werden.
Die Kontext-Betrachtung geht mMn immer in beide Richtungen.
Wie muss also ein variables Template vorbereitet werden, damit es in sprintf() keine Probleme machen wird?
Liebe Grüße
Tom S.
Tach!
Die Kontext-Betrachtung geht mMn immer in beide Richtungen.
Wie muss also ein variables Template vorbereitet werden, damit es in sprintf() keine Probleme machen wird?
Ich wiederhole mich: Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten.
dedlfix.
Ansich cool, aber was mache ich wenn die Eingabe variablen variieren, wenn also einmal mehr einmal weniger da sind. Ich meine es sind verschiedene Texte und eine große Anzahl an Variablen.
wenn ich einen Text habe in dem 6 Variablen (Platzhalter) sind dann wieder einen Text in dem 20 Variablen(Platzhalter) sind.
Hallo Korbinian,
dann ist sprintf mit Position nicht mehr sinnvoll. Vor allem angesichts der von mir unten angerissenen Probleme solltest Du tatsächlich deine Fertigungstiefe überdenken und die Standard-Engines für Templates anschauen.
Rolf
Hello,
Ansich cool, aber was mache ich wenn die Eingabe variablen variieren, wenn also einmal mehr einmal weniger da sind. Ich meine es sind verschiedene Texte und eine große Anzahl an Variablen.
wenn ich einen Text habe in dem 6 Variablen (Platzhalter) sind dann wieder einen Text in dem 20 Variablen(Platzhalter) sind.
Deshalb fragte ich nach der Vorbehandlung des Templates für den Kontext (hier in Richtung "untergeordneter Kontext"). Gemeint waren damit die Platzhalter im Text.
#Vorgehensweise:
zuerst bestimmst Du die Platzhalter-Begrenzer. Dazu eigenen sich z. B. Konstrukte, wie "<!--{{ ??? }}-->", oder auch nur "[{ ??? }]", ganz nach Geschmack. Es sollten jedenfalls möglichst paarweise Begrenzer sein (also einen für "Start" und einen für "Stop"). Die ??? stehen hier für den eigentlichen Bezeichner in der DB. Diese Begrenzer dürfen dann weder im Roh-Template, noch in den Daten vorkommen. Entweder, men verbietet sie vollkommen, oder sie müssten an beiden Stellen maskiert werden.
Nach der Vorbehandlung des Templates kannst Du die (passiven) Werte in die Platzhalter einsetzen. Das geht bei PHP mit einem einfachen str_replace() in der Array-Variante.
Du baust Dir dazu ein Array auf, dessen Schlüssel die Platzhalter sind und dessen Werte die einzusetzenden Werte aus der Datenbank sind.
mittles zweier Hilfsfunktionen kannst Du dir vorher alle im Text verfügbaren Platzhalter, bzw. alle aus der Datenbank kommenden anzeigen lassen und so kreuzweise abgleichen, ob etwas vergessen wurde.
Je nach umgebendem Kentext (z. B. HTML-Ausgabe) kannst Du entscheiden, ob nicht erfüllte Platzhalter aus dem Resultattext entfernt werden sollen, als HTML-Warnug erscheinen sollen, oder aber als (im gerenderten Text) unsichtbare HTML-Komentare stehen bleiben sollen.
Die Platzhalterarrays lassen sich auch kaskadieren. Wenn also am Anfang z. B. "{{Fullname}}" im Array steht mit dem zugeorneten Wert "{{Firstname}} {{Familiyname}}" und in späteren Elemente des Arrays die beiden Teilplatzhalter "{{Familyname}}" und "{{Firstname}}" wieder auftauchen mit ihren zugehörigen Werten, dann werden die entsprechend ersetzt.
Für statische Werte kann mit PHP (und vielen anderen Skriptspreachen) daher mit wenigen Handgriffen leistungsstarke passive Templates aufbauen. Diese Templates können dann von DAUs aufgebaut werden, ohne dass sie Dir die ganze Ausgabe zerschießen, oder sogar Zugriff auf das aktive Backend bekommen.
Liebe Grüße
Tom S.
Hallo Korbinian,
du kannst so ähnlich vorgehen wie vorgeschlagen wurde - das ist dann eleganter, einfacher Code, aber du produzierst damit Gestammel statt Deutsch, wenn die Anzahlen einen Singular statt Plural erfordern.
stadt: Klein-Dingenskirchen anzahl-gef: 1 anzahl-ins: 1 weibl-in: 1 man-ins: 0
"In Klein-Dingenskirchen gibt es 1 Gefängnisse. In diesen sitzen zur Zeit 1 Gefangene ein. Davon wiederum sind 0 weiblich und 1 männlich."
Wenn das für dich OK ist - alles gut. Wenn nicht, hat die Eleganz nun ein Ende.
Serienbriefschreibung mit korrekter Grammatik ist nicht trivial. Vor allem nicht im Satzbau deines Beispiels. Du musst alle Stellen des Textes identifizieren, die von Anzahlen abhängig sind, und dann schauen, welche Konjugationen oder Deklinationen erforderlich sind. Bei isolierten Zahlen ist das normalerweise eine Unterscheidung zwischen "Anzahl=1" und "alles andere" - aber das ist bei Dir nicht so. Du hast Frauen und Männer, d.h. du brauchst nicht nur Numerus-Kongruenz, sondern auch Genus-Kongruenz. Die wirst Du kaum nach Standardschema hinbekommen, statt dessen musst du die Kombinationen von "weibl-in = 0 / 1 / sonst" und "man-ins = 0 / 1 / sonst" betrachten und gucken, wieweit Du das separat behandeln musst, um gutes Deutsch herauszubekommen. Ich denke da an Fälle wie "weibl=0 und man=1", dann "sitzt ein Gefangener" ein - ein blödes R, das nur in diesem Fall dorthin muss.
Sowas ohne Hilfsprogrammierung in ein Template zu bekommen ist durchaus eine Herausforderung. Es wird dann auf eine selbstgemachte Ersatzprogrammiersprache hinauslaufen, oder auf fertige Template-Engines, die sowas mitbringen.
Viel Glück.
Rolf
@@Rolf b
Serienbriefschreibung mit korrekter Grammatik ist nicht trivial.
Und da haben wir es im Deutschen noch einfach. In slawischen Sprachen steht das Substantiv nach 42 in einem anderen Fall als nach 45.
LLAP 🖖
Hallo Gunnar,
Das glaube ich Dir nur mit reputabler Quellenangabe.
Rolf
@@Rolf b
Das glaube ich Dir nur mit reputabler Quellenangabe.
https://twitter.com/g16n/status/710822897166761984 f.
LLAP 🖖
Hallo Gunnar Bittersmann,
Ups. Ich hätte auch ein anderes Substantiv nehmen können.
Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?
Bis demnächst
Matthias
@@Matthias Apsel
Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?
Lass mich raten: eins, was in vielen Fällen gleich ist (-ности), wo man also nicht erkennt, dass nach 43 und 49 ein anderer Fall steht?
LLAP 🖖
@@Gunnar Bittersmann
Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?
Lass mich raten: eins, was in vielen Fällen gleich ist (-ности), wo man also nicht erkennt, dass nach 43 und 49 ein anderer Fall steht?
Funfact: Ich war bei der Eröffnung eines Jugendclubs in Bernau dabei (hab dort auch aufgespielt) und an der Abstimmung über dessen Namen teilgenommen. And the winner was: ebendieses Wort. War dann aber wohl doch zu lang und so heißt der Club allgemeinhin Dosto.
LLAP 🖖
Hallo Gunnar Bittersmann,
War dann aber wohl doch zu lang und so heißt der Club allgemeinhin Dosto.
Ebenjenes Wort lässt sich auch als Merkwürdigkeit übersetzen. 😜
Bis demnächst
Matthias
Hallo
… so heißt der Club allgemeinhin Dosto.
Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀
Tschö, Auge
@@Auge
… so heißt der Club allgemeinhin Dosto.
Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀
Wie jetzt, du auch aus Bernau?
(Wohl nicht, sonst würdest du ja nicht Friedenstal, sondern Zickzackhausen sagen.)
LLAP 🖖
Hallo
… so heißt der Club allgemeinhin Dosto.
Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀
Wie jetzt, du auch aus Bernau?
Nein, bloß nicht. Ich war aber in den 1990ern in Bernau und in dessen Umland (bis hoch nach Marienwerder) oft zugange.
(Wohl nicht, sonst würdest du ja nicht Friedenstal, sondern Zickzackhausen sagen.)
Ich habe mich bezüglich der Verortung des GuWa auf openstreetmap.org nur an der S-Bahn-Linie orientiert. Der Bahnhof Bernau-Friedenstal ist halt dort, wo die Baracke des GuWa früher stand. Zudem ist mir der Name Zickzackhausen tatsächlich unbekannt. Die auf openstreetmap.org angezeigte Bebauung an der Elbestraße lässt mich vermuten, dass sich der Name genau davon ableitet. Standen die Häuser denn in den 1990ern schon?
Tschö, Auge
@@Auge
Zudem ist mir der Name Zickzackhausen tatsächlich unbekannt. Die auf openstreetmap.org angezeigte Bebauung an der Elbestraße lässt mich vermuten, dass sich der Name genau davon ableitet.
Ja. Auch Würfelbauten genannt; wobei jeweils 2 Würfel 2 Wohnungen (jeweils über eine Etage) beherbergen, glaub ich.
Standen die Häuser denn in den 1990ern schon?
Ja. Ich tippe mal auf in den 80ern erbaut, wenn nicht sogar schon Ende der 70er.
Ich erinnere mich an einen Lehrer, der sich immer ereiferte, wenn jemand „Zickzackhausen“ sagte. „Das heißt ‚Angara-Siedlung‘!“ (Die Straßen dort tragen die Namen von Flüssen; eine ist die Angarastraße. „Friedenstal“ war damals völlig unbekannt.)
Und mir klingt es im Ohr, als sagte er „Angára-Siedlung“; dabei wird der Fluss doch „Angará“ ausgesprochen. Hätte man ihn mal freundlich darauf hinweisen sollen, wenn er schon andere belehren will, das doch bitteschön richtig zu tun. Hätte er aber nicht gutgefunden, glaube ich. Klugschiss austeilen ja, einstecken nein.
LLAP 🖖
Hallo Rolf b,
Das glaube ich Dir nur mit reputabler Quellenangabe.
Da kannst du jeden fragen, der im Russisch-Unterricht aufgepasst hat.
(1 Jahr / 2 Jahre / 5 Jahre …)
Bis demnächst
Matthias
Hallo Korbinian,
hört sich nach einer interessanten Statistik an. Geht das noch weiter ins Detail oder nur männlich/weiblich? Falls umfangreicher, würde mich das fertige Projekt interessieren, wäre also nett, wenn du das dann zeigen würdest, wenn möglich.
Zu deiner DB selbst, nur als Anregung, wenn's bei den einfachen Einträgen bleibt ohne komplexe Vergleichsrechnungen, würde ich es nicht über Mysql machen, sondern textbasiert/CSV oder allenfalls Sqlite, ist aber nur meine persönliche Vorliebe für kompakte, autarke Anwendungen.
Gruss
Henry