Lewati ke konten utama

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 iterasi
  • collection - 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:

  1. Memeriksa apakah koleksi tersebut berisi barang apa pun.
  2. Melakukan iterasi melalui item jika tersedia.
  3. 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

  1. Batasi ukuran koleksi - Saring koleksi besar sebelum pemrosesan templat.
  2. Hindari membuat sarang yang terlalu dalam. - Batasi perulangan bersarang hingga 2-3 level untuk performa yang lebih baik.
  3. Praproses data - Lakukan perhitungan kompleks sebelum mengirimkan data ke template
  4. 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>>

Iterasi Kompleks

Untuk skenario iterasi kompleks, pertimbangkan untuk melakukan pra-pemrosesan data Anda dalam logika aplikasi sebelum meneruskannya ke templat. Ini meningkatkan keterbacaan dan kinerja templat.