Zum Hauptinhalt springen

Wiederholung von Absätzen – Leitfaden für Foreach-Schleifen

Dokumente enthalten häufig wiederkehrende Inhaltsstrukturen wie Listen von Elementen, mehrere Datensätze oder wiederholte Abschnitte mit ähnlicher Formatierung. PDF4meDie Template-Engine von bietet leistungsstarke Iterationsfunktionen, um dynamisch mehrere Absätze und Abschnitte aus Datensammlungen zu generieren.


Foreach-Schleifen verstehen

Der foreach Die Schleife ist der primäre Mechanismus, um Datensammlungen zu durchlaufen und wiederkehrende Inhalte zu generieren. In jeder Iteration wird ein Element der Sammlung verarbeitet und die entsprechende Ausgabe erzeugt.

Grundlegende Foreach-Syntax

<<foreach [item in collection]>>
Content with <<[item.property]>>
<</foreach>>

Komponenten:

  • item - Variable, die das aktuelle Element in der Iteration darstellt
  • collection - Das Datenarray oder die Datensammlung, die durchlaufen werden soll
  • Inhaltsblock – Vorlageninhalt, der für jedes Element wiederholt wird

Wiederkehrende Absätze

Generieren Sie mehrere Absätze, indem Sie eine Datensammlung durchlaufen und für jedes Element formatierten Text erstellen.

Beispiel: Anwendungsbewertungen

Vorlagensyntax:

<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>

Datenquelle (JSON):

{
"surveyName": "Top-rated Apps",
"applications": [
{
"listAppName": "Instagram",
"listAppType": "iOS",
"category": "Social Media",
"AppRating": "4.9"
},
{
"listAppName": "Whatsapp",
"listAppType": "iOS",
"category": "Chat",
"AppRating": "4.8"
},
{
"listAppName": "Player UG",
"listAppType": "Android",
"category": "Gaming",
"AppRating": "4.75"
}
]
}

Generierte Ausgabe:

Instagram in iOS platform is a Social Media app and has a 4.9 rating.
Whatsapp in iOS platform is a Chat app and has a 4.8 rating.
Player UG in Android platform is a Gaming app and has a 4.75 rating.

Umgang mit leeren Sammlungen

Wenn eine Sammlung leer sein könnte, verwenden Sie die Any() Methode zur Überprüfung der Daten vor der Iteration. Dies verhindert Null-Ausnahmen und ermöglicht die Anzeige alternativer Inhalte.

Grundlegende Nullprüfung

Vorlage mit Any()-Prüfung:

<<if [applications.Any()]>>
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
<<else>>No applications listed
<</if>>

Dieser Ansatz:

  1. Prüft, ob die Sammlung Elemente enthält.
  2. Durchläuft die Elemente, falls verfügbar
  3. Zeigt eine Ausweichmeldung an, falls die Sammlung leer ist.

Verschachtelte Foreach-Schleifen

Erstellen Sie hierarchische Strukturen, indem Sie foreach-Schleifen ineinander verschachteln. Dies ist nützlich, um Eltern-Kind-Beziehungen oder mehrstufige Datenstrukturen darzustellen.

Beispiel: Abteilung und Mitarbeiter

Vorlage:

<<foreach [dept in departments]>>
Department: <<[dept.name]>>
<<foreach [emp in dept.employees]>>
- <<[emp.name]>> (<<[emp.position]>>)
<</foreach>>
<</foreach>>

Daten:

{
"departments": [
{
"name": "Engineering",
"employees": [
{ "name": "John Smith", "position": "Senior Developer" },
{ "name": "Jane Doe", "position": "Tech Lead" }
]
},
{
"name": "Marketing",
"employees": [
{ "name": "Mike Johnson", "position": "Marketing Manager" }
]
}
]
}

Wiederholende komplexe Abschnitte

Foreach-Schleifen können ganze Inhaltsabschnitte wiederholen, einschließlich mehrerer Absätze, Formatierungen und verschachtelter Strukturen.

Wiederholungen über mehrere Absätze

Vorlage:

<<foreach [product in products]>>
Product Name: <<[product.name]>>
Description: <<[product.description]>>
Price: $<<[product.price]>>
Available: <<[product.inStock]>>

<</foreach>>

Diese Vorlage generiert für jedes Produkt einen vollständigen Produktbeschreibungsblock, wobei alle Formatierungen und Absatzumbrüche erhalten bleiben.


Bedingte Iteration

Kombinieren Sie foreach-Schleifen mit bedingten Anweisungen zur selektiven Inhaltsgenerierung.

Beispiel: Bedingte Anzeige

Vorlage:

<<foreach [employee in employees]>>
<<if [employee.age > 50]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</if>>
<</foreach>>

Alternativ können Sie Aufzählungsmethoden verwenden:

Vorlage:

<<foreach [employee in employees.Where(e => e.age > 50)]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</foreach>>

Formatierung innerhalb von Schleifen

Wenden Sie Formatierungen auf Felder innerhalb von foreach-Schleifen an, um eine einheitliche Ausgabedarstellung zu gewährleisten.

Vorlage:

<<foreach [customer in customers]>>
Customer: <<[customer.name]:caps>>
Last Visit: <<[customer.lastVisit]:"MMMM dd, yyyy">>
Status: <<[customer.status]:upper>>

<</foreach>>

Schleifenvariablen und Indizierung

Informationen zur Schleifenposition können mithilfe impliziter Variablen abgerufen werden (sofern dies von Ihrer Template-Engine-Version unterstützt wird).

Gemeinsame Schleifenvariablen

  • Aktueller Artikelindex (0-basiert oder 1-basiert, je nach Implementierung)
  • Schleifeniterationsanzahl
  • Indikatoren für erstes/letztes Element

Beispielhafte Verwendung (sofern unterstützt):

<<foreach [item in items]>>
<<[$index + 1]>>. <<[item.name]>>
<</foreach>>

Leistungsüberlegungen

Bewährte Verfahren für Schleifen

  1. Maximale Sammlungsgröße - Große Sammlungen vor der Vorlagenverarbeitung filtern.
  2. Vermeiden Sie tiefe Nester - Beschränken Sie verschachtelte Schleifen auf 2-3 Ebenen, um eine bessere Leistung zu erzielen.
  3. Daten vorverarbeiten - Führe komplexe Berechnungen durch, bevor du Daten an Vorlagen übergibst.
  4. Nutzen Sie effiziente Abfragen - Daten auf Datenquellenebene filtern und sortieren

Beispiel: Vorgefilterte Daten

Anstatt:

<<foreach [emp in employees.Where(e => e.age > 30).OrderBy(e => e.name)]>>

Filtern Sie die Daten in Ihrer Anwendung vor und leiten Sie die gefilterten Daten weiter:

<<foreach [emp in filteredEmployees]>>

Gemeinsame Muster

Muster 1: Nummerierte Liste

<<foreach [item in items]>>
<<[$index]>>. <<[item.title]>>
<</foreach>>

Muster 2: Gruppierter Inhalt

<<foreach [category in categories]>>
## <<[category.name]>>

<<foreach [item in category.items]>>
- <<[item.name]>>
<</foreach>>
<</foreach>>

Muster 3: Zusammenfassung

<<foreach [report in reports]>>
Report: <<[report.title]>>
Total Records: <<[report.records.Count()]>>
Average Value: <<[report.records.Average(r => r.value)]>>
<</foreach>>

Fehlerbehebung

Häufige Probleme

Ausgabe: Nullreferenzfehler Lösung: Verwenden Any() Sammlungen vor der Iteration prüfen

Ausgabe: Unerwünschte Zeilenumbrüche oder Leerzeichen Lösung: Achten Sie sorgfältig auf den Leerraum in Ihrer Vorlage.

Ausgabe: Leistungsprobleme bei großen Datenmengen Lösung: Daten vorfiltern und Sammlungsgrößen begrenzen

Ausgabe: Fehlerhafte Datenbindung ... Lösung: Überprüfen Sie, ob die Eigenschaftsnamen exakt mit Ihrer Datenstruktur übereinstimmen.


Praxisbeispiel: Rechnungspositionen

Vollständige Vorlage:

Invoice #<<[invoiceNumber]>>
Date: <<[invoiceDate]:"dd.MM.yyyy">>

Items:
<<if [lineItems.Any()]>>
<<foreach [item in lineItems]>>
<<[item.name]:caps>> - Qty: <<[item.quantity]>> - Price: $<<[item.price]:"F2">> - Total: $<<[item.quantity * item.price]:"F2">>
<</foreach>>

Subtotal: $<<[lineItems.Sum(i => i.quantity * i.price)]:"F2">>
<<else>>
No items in this invoice.
<</if>>

:::Tipp Komplexe Iterationen Bei komplexen Iterationsszenarien empfiehlt es sich, die Daten in der Anwendungslogik vorzuverarbeiten, bevor sie an die Vorlage übergeben werden. Dies verbessert die Lesbarkeit und Leistung der Vorlage.

:::