Panduan Penggunaan Perulangan Foreach untuk Mengulang Paragraf
Dokumen sering kali berisi struktur konten yang berulang seperti daftar item, beberapa catatan, atau bagian yang berulang dengan format yang serupa. PDF4meMesin templatnya menyediakan kemampuan iterasi yang ampuh untuk menghasilkan banyak paragraf dan bagian secara dinamis dari kumpulan data.
Memahami Perulangan Foreach
Yang foreach Loop adalah mekanisme utama untuk mengulang melalui kumpulan data dan menghasilkan konten yang berulang. Setiap iterasi memproses satu item dari koleksi dan menghasilkan output yang sesuai.
Sintaks Foreach Dasar
<<foreach [item in collection]>>
Content with <<[item.property]>>
<</foreach>>
Komponen:
item- Variabel yang mewakili elemen saat ini dalam iterasicollection- Larik atau koleksi data yang akan diiterasi- Blok konten - Konten templat diulang untuk setiap item
Paragraf Berulang
Buat beberapa paragraf dengan melakukan iterasi melalui kumpulan data dan membuat teks yang diformat untuk setiap item.
Contoh: Peringkat Aplikasi
Sintaks Templat:
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
Sumber Data (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"
}
]
}
Output yang dihasilkan:
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.
Menangani Koleksi Kosong
Jika suatu koleksi mungkin kosong, gunakan Any() Metode untuk memeriksa data sebelum melakukan iterasi. Ini mencegah pengecualian null dan memungkinkan Anda untuk menampilkan konten alternatif.
Pemeriksaan Null Dasar
Templat dengan Pemeriksaan Any():
<<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>>
Pendekatan ini:
- Memeriksa apakah koleksi tersebut berisi barang apa pun.
- Melakukan iterasi melalui item jika tersedia.
- Menampilkan pesan cadangan jika koleksi kosong
Perulangan Foreach Bersarang
Buat struktur hierarkis dengan menyusun perulangan foreach di dalam satu sama lain. Ini berguna untuk menampilkan hubungan induk-anak atau struktur data bertingkat.
Contoh: Departemen dan Karyawan
Templat:
<<foreach [dept in departments]>>
Department: <<[dept.name]>>
<<foreach [emp in dept.employees]>>
- <<[emp.name]>> (<<[emp.position]>>)
<</foreach>>
<</foreach>>
Data:
{
"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" }
]
}
]
}
Bagian Kompleks yang Berulang
Perulangan foreach dapat mengulang seluruh bagian konten termasuk beberapa paragraf, pemformatan, dan struktur bersarang.
Pengulangan Beberapa Paragraf
Templat:
<<foreach [product in products]>>
Product Name: <<[product.name]>>
Description: <<[product.description]>>
Price: $<<[product.price]>>
Available: <<[product.inStock]>>
<</foreach>>
Templat ini menghasilkan blok deskripsi produk lengkap untuk setiap produk, dengan mempertahankan semua format dan pemisah paragraf.
Iterasi Bersyarat
Gabungkan perulangan foreach dengan pernyataan kondisional untuk menghasilkan konten secara selektif.
Contoh: Tampilan Bersyarat
Templat:
<<foreach [employee in employees]>>
<<if [employee.age > 50]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</if>>
<</foreach>>
Alternatifnya, gunakan metode enumerasi:
Templat:
<<foreach [employee in employees.Where(e => e.age > 50)]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</foreach>>
Pemformatan di Dalam Perulangan
Terapkan pemformatan pada kolom di dalam perulangan foreach untuk mendapatkan gaya keluaran yang konsisten.
Templat:
<<foreach [customer in customers]>>
Customer: <<[customer.name]:caps>>
Last Visit: <<[customer.lastVisit]:"MMMM dd, yyyy">>
Status: <<[customer.status]:upper>>
<</foreach>>
Variabel Perulangan dan Pengindeksan
Akses informasi posisi loop menggunakan variabel implisit (jika didukung oleh versi mesin template Anda).
Variabel Loop Umum
- Indeks item saat ini (berbasis 0 atau berbasis 1 tergantung pada implementasi)
- Jumlah iterasi loop
- Indikator item pertama/terakhir
Contoh Penggunaan (jika didukung):
<<foreach [item in items]>>
<<[$index + 1]>>. <<[item.name]>>
<</foreach>>
Pertimbangan Kinerja
Praktik Terbaik untuk Perulangan
- Batasi ukuran koleksi - Saring koleksi besar sebelum pemrosesan templat.
- Hindari membuat sarang yang terlalu dalam. - Batasi perulangan bersarang hingga 2-3 level untuk performa yang lebih baik.
- Praproses data - Lakukan perhitungan kompleks sebelum mengirimkan data ke template
- Gunakan kueri yang efisien. - Menyaring dan mengurutkan data pada tingkat sumber data
Contoh: Data yang Telah Difilter Sebelumnya
Alih-alih:
<<foreach [emp in employees.Where(e => e.age > 30).OrderBy(e => e.name)]>>
Lakukan pra-penyaringan di aplikasi Anda dan teruskan data yang telah disaring:
<<foreach [emp in filteredEmployees]>>
Pola Umum
Pola 1: Daftar Bernomor
<<foreach [item in items]>>
<<[$index]>>. <<[item.title]>>
<</foreach>>
Pola 2: Konten yang Dikelompokkan
<<foreach [category in categories]>>
## <<[category.name]>>
<<foreach [item in category.items]>>
- <<[item.name]>>
<</foreach>>
<</foreach>>
Pola 3: Bagian Ringkasan
<<foreach [report in reports]>>
Report: <<[report.title]>>
Total Records: <<[report.records.Count()]>>
Average Value: <<[report.records.Average(r => r.value)]>>
<</foreach>>
Penyelesaian Masalah
Masalah Umum
Masalah: Kesalahan referensi null
Larutan: Menggunakan Any() untuk memeriksa koleksi sebelum iterasi
Masalah: Pemutusan baris atau spasi yang tidak diinginkan Larutan: Kelola spasi kosong dengan cermat di templat Anda.
Masalah: Masalah kinerja dengan koleksi besar Larutan: Lakukan pra-penyaringan data dan batasi ukuran pengumpulan data.
Masalah: Pengikatan data yang salah Larutan: Pastikan nama properti sesuai persis dengan struktur data Anda.
Contoh Praktis: Item Baris Faktur
Templat Lengkap:
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>>
Untuk skenario iterasi kompleks, pertimbangkan untuk melakukan pra-pemrosesan data Anda dalam logika aplikasi sebelum meneruskannya ke templat. Ini meningkatkan keterbacaan dan kinerja templat.