ffCCBot/2.0 (http://commoncrawl.org/faq/)
NEW!! Buku Query MySQL Lihat Detail » x

Memahami Perulangan For Pada PHP

Hi.. pada kesempatan kali ini kita akan membahas salah satu bentuk perulangan yang populer dan sering digunakan (termasuk saya sendiri)  yaitu perulangan for pada PHP.

PHP sendiri menyediakan beberapa fungsi loop, yaitu while, do/while, dan for. Perbedaan antara while, do/while, dan for yaitu untuk for, sudah diketahui banyaknya pengulangan, sedangkan while dan do/while belum diketahui berapa banyaknya pengulangan.

I. Penulisan For Pada PHP

Perulangan for pada PHP dapat ditulis menggunakan kurung kurawa, colon, atau tanpa keduanya:

// Kurung Kurawa, paling umum digunakan
for (ekspresi1; ekspresi2 ; ekspresi3) { 
	// kode 
}

// Colon
for (ekspresi1; ekspresi2 ; ekspresi3) :
	// kode 
endfor;

// Tanpa Keduanya
for (ekspresi1; ekspresi2 ; ekspresi3)
	statement;

Dalam menjalankan fungsi loop, PHP akan melakukan eksekusi dengan urutan sebagai berikut:

  1. PHP akan membaca ekspresi1
  2. Selanjutnya PHP akan mengevaluasi ekspresi2, jika nilanya TRUE, maka statement di dalam kurung kurawa dijalankan, jika bernilai FALSE maka loop dihentikan.
  3. Setelah itu PHP akan mengevaluasi atau menjalankan ekspresi3

begitu seterusnya hingga loop selesai, jika digambarkan dalam bentuk flowchart:

Perulangan For Pada PHP

Ketentuan mengenai ekspresi

Beberapa ketentuan terkait penulisan ekspresi:

  1. Semua ekspresi dapat bernilai kosong atau dapat bernilai lebih dari satu dengan pemisah tanda koma
  2. Semua ekspresi pada ekspresi2 akan di evaluasi, namun untuk menentukan nilai (TRUE atau FALSE – yang menentukan loop berhenti atau berlanjut), digunakan ekspresi yang terakhir.
  3. Jika ekspresi2 yang bernilai kosong maka loop akan dijalankan terus hingga dihentikan oleh break statemen yang ada di dalam kurung kurawa.

Berikut beberapa contoh penulisan for loop dengan berbagai ekspresi yang semuanya akan mencetak angka 1 s.d 10. (Bentuk 1 merupakan bentuk yang sering (atau selalu) dipakai (termasuk saya))

<?php
/* 
Contoh 1, bentuk lengkap, SERING DAN UMUM DIGUNAKAN
*/

for ($i = 1; $i <= 10; $i++) {
    echo $i;
}

/*
Contoh 2, dengan ekspresi2 kosong, kode dihentikan dengan brak statement 
*/

for ($i = 1; ; $i++) {
    if ($i > 10) {
        break;
    }
    echo $i;
}

/* 
Contoh 3, semua ekspresi kosong
*/

$i = 1;
for ( ; ; ) {
    if ($i > 10) {
        break;
    }
    echo $i;
    $i++;
}

/* 
Contoh 4, tanpa statement hanya ekspresi saja
 */

for ($i = 1; $i <= 10; print $i, $i++);
?>

II. Melompati (skip) For Loop Pada Nilai Tertentu

Pada saat menjalankan loop, terkadang pada kondisi/nilai tertentu, kita ingin melompatinya (skip), untuk keperluan tersebut, kita dapat menggunakan statement continue contoh:

<?php
for ($i = 1; $i <= 10; $i++) {
	if ($i == 5) {
		continue;
	}
    echo $i; // 1 2 3 4 6 7 8 9 10
}
?>

III. Tips Optimasi Perulangan For Pada PHP

Berikut ini beberapa tips yang dapat kita terapkan agar perulangan for dapat dieksekusi dengan cepat

1 Hindari pemanggilan fungsi dan pendefinisian variabel yang nilainya tetap di dalam loop

Fungsi ini dapat berupa fungsi bawaan PHP seperti count, substr, strlen, dll maupun fungsi yang kita buat sendiri, contoh berikut pengulangan untuk mendapatkan nama bulan:

<?php
$bulan = array('1'=>'Januari', 
			'Februari', 
			'Maret' , 
			'April' , 
			'Mei', 
			'Juni', 
			'Juli', 
			'Agustus', 
			'September', 
			'Oktober', 
			'November', 
			'Desember'
		);
$batas_waktu = '2015-11-10';
echo '<table>
		<tr>
			<th>Bulan</th>
			<th>Keterangan</th>
		</tr>';
for ($i = 1; $i <= count($bulan); $i++)
{	
	$bln_batas = date("m",strtotime($batas_waktu));
	echo '<tr>
			<td> ' . strtoupper($bulan[$i]) . ' </td>';
		
	if ($bln_batas == $i)
		echo '<td>Batas waktu penulisan</td>';
	else
		echo '<td>-</td>';
		
	echo '</tr>';
}

echo '</table>';
?>

output:

Bulan Keterangan
JANUARI
FEBRUARI
MARET
APRIL
MEI
JUNI
JULI
AGUSTUS
SEPTEMBER
OKTOBER
NOVEMBER Batas waktu penulisan
DESEMBER

dari contoh tersebut PHP akan: (1) memanggil fungsi count($bulan), (2) fungsi date("m",strtotime($batas_waktu)) dan (3) mendefinisikan variabel $bln_batas berulang ulang, hal tersebut tidak efisien karena akan memakan waktu dan resource.

Berbeda dengan fungsi strtoupper yang memang diperlukan di dalam loop, karena nilainya berubah ubah sesuai nama bulan. Untuk itu, fungsi dan variabel yang nilainya tetap sebaiknya didefinisikan di luar loop, kode dapat ditulis ulang menjadi:

<?php
$bln_batas = date("m",strtotime($batas_waktu));
$jml_bln   = count($bulan);		
for ($i = 1; $i <= $jml_bln, $i++)
{
	// code
}
?>

atau

<?php
$bln_batas = date("m",strtotime($batas_waktu));
for ($i = 1, $jml_bln = count($bulan); $i <= $jml_bln, $i++)
{
	//code
}
?>

dari contoh diatas, waktu eksekusi lebih cepat karena fungsi count dan date, serta pendefinisian variabel $bln_batas hanya dijalankan sekali. Dalam kode diatas terdapat $i++, kode tersebut merupakan kependekan dari $i = $i + 1.

Praktek di lapangan bisa menjadi lebih kompleks, misal dengan contoh diatas, kita akan menambahkan informasi deadline suatu tahapan, misal output yang diinginkan adalah:

Bulan Deadline
Tahapan Tanggal
JANUARI Perencanaan 2015-01-31
FEBRUARI Analisis 2015-02-28
MARET Perancangan 2015-03-31
APRIL Penerapan 2015-04-30
MEI Evaluasi 2015-05-31
JUNI Penggunaan 2015-06-30
JULI
AGUSTUS
SEPTEMBER
OKTOBER
NOVEMBER
DESEMBER

Kode yang kita gunakan:

<?php
$bulan = array('1'=>'Januari', 
			'Februari', 
			'Maret' , 
			'April' , 
			'Mei', 
			'Juni', 
			'Juli', 
			'Agustus', 
			'September', 
			'Oktober', 
			'November', 
			'Desember'
		);

// Informai yang diperoleh dari database
$tahapan = array(
				array('tahap' => 'Perencanaan',	'tgl' => '2015-01-31'),
				array('tahap' => 'Analisis',	'tgl' => '2015-02-28'),
				array('tahap' => 'Perancangan',	'tgl' => '2015-03-31'),
				array('tahap' => 'Penerapan',	'tgl' => '2015-04-30'),
				array('tahap' => 'Evaluasi',	'tgl' => '2015-05-31'),
				array('tahap' => 'Penggunaan',	'tgl' => '2015-06-30')
			);
echo '<table>
		<tr>
			<th rowspan="2">Bulan</th>
			<th colspan="2">Deadline</th>
		</tr>
		<tr>
			<th>Tahapan</th>
			<th>Tanggal</th>
		</tr>
	
		';

$jml_bln = 
for ($i = 1; $i <= count($bulan); $i++)
{	
	echo '<tr>
			<td> ' . strtoupper($bulan[$i]) . ' </td>';
		
		$data_tahapan = false;
		foreach ($tahapan as $tahap)
		{
			$bln_batas = date("m",strtotime($tahap['tgl']));
			if ($bln_batas == $i) {
				echo '<td>'.$tahap['tahap'].'</td>
					  <td>'.$tahap['tgl'].'</td>';
				$data_tahapan = true;
			}
			
		}
		if (!$data_tahapan)
				echo '<td>-</td>
					 <td>-</td>';
		
	echo '</tr>';
}
echo '</table>';
?>

dari data diatas terdapat pengulangan fungsi date yaitu sebanyak 72 kali (12 x 6), dengan struktur data seperti diatas, agak ribet jika harus memenuhi kondisi ideal seperti contoh sebelumnya.

Kondisi tersebut dapat dipenuhi, namun kode yang ditulis bisa jadi menjadi lebih kompleks dan membutuhkan tenaga yang lebih untuk memahaminya (tergantung kondisi lapangan).

Pada kondisi ini, kondisi ideal dapat dilanggar jika kode yang ditulis menjadi lebih sederhana dan mudah dipahami dan performa aplikasi juga tidak terganggu.

Namun jika tidak ada salahnya kita mencobanya. Dengan sedikit perubahan, kode diatas dapat kita tulis kembali menjadi:

<?php
$bulan = array('1'=>'Januari', 
			'Februari', 
			'Maret' , 
			'April' , 
			'Mei', 
			'Juni', 
			'Juli', 
			'Agustus', 
			'September', 
			'Oktober', 
			'November', 
			'Desember'
		);

// Informai yang diperoleh dari database
$tahapan = array(
				array('tahap' => 'Perencanaan',	'tgl' => '2015-01-31'),
				array('tahap' => 'Analisis',	'tgl' => '2015-02-28'),
				array('tahap' => 'Perancangan',	'tgl' => '2015-03-31'),
				array('tahap' => 'Penerapan',	'tgl' => '2015-04-30'),
				array('tahap' => 'Evaluasi',	'tgl' => '2015-05-31'),
				array('tahap' => 'Penggunaan',	'tgl' => '2015-06-30')
			);

foreach ($tahapan as $key => $tahap)
{
	$bln_batas = date("n",strtotime($tahap['tgl']));
	$ref_tahapan[$bln_batas] = $key;
}
echo '<table>
		<tr>
			<th rowspan="2">Bulan</th>
			<th colspan="2">Deadline</th>
		</tr>
		<tr>
			<th>Tahapan</th>
			<th>Tanggal</th>
		</tr>
	
		';

$jml_bln = count($bulan);
for ($i = 1; $i <= $jml_bln; $i++)
{	
	echo '<tr>
			<td> ' . strtoupper($bulan[$i]) . ' </td>';
		
			if (key_exists($i, $ref_tahapan))
			{
				echo '<td>'.$tahapan[$ref_tahapan[$i]]['tahap'].'</td>
					  <td>'.$tahapan[$ref_tahapan[$i]]['tgl'].'</td>';
			} 
			else
			{				
				echo '<td>-</td>
					 <td>-</td>';
			}
			
	echo '</tr>';
}
echo '</table>';
?>

pada kode diatas line 26 s.d 30 kita membuat variabel baru bernama $ref_tahapan yang berbentuk array dengan key bulan dan value index dari array tahapan, contoh $ref_tahapan[1] = 0 yang berarti bulan 1 merujuk ke $tahapan[0].

Kode diatas tidak terlalu kompleks dan masih wajar untuk digunakan walaupun pengguna kode membuat kita harus menambah tenaga untuk memahami variabel baru $ref_tahapan

Ketika di tes, kode diatas membutuhkan waktu eksekusi 0.0011389255523682 detik sedangkan sebelumnya 0.014470100402832 detik, tidak terasa perbedaannya oleh karena itu kita dapat menggunakan kedua cara diatas, namun jika kode yang ditulis kompleks, cara kedua bisa dipertimbangkan untuk digunakan.

2 Hindari eksekusi perintah SQL di dalam loop

Sebisa mungkin jangan pernah melakukan eksekusi kode SQL di dalam loop, dengan eksekusi yang berulang ulang maka akan memberatkan server database yang pada akhirnya akan menurunkan performa aplikasi anda.

Contoh dibawah ini pengulangan eksekusi MySQL di dalam loop (variabel $bulan menggunakan contoh sebelumnya):

$jml_bln = count($bulan); 
for ($i = 1; $i <= $jml_bln, $i++) { 
	$bln	= substr('0'.$i, -2); 
	$sql 	= 'SELECT jml_byr FROM penjualan WHERE MONTH(tgl_byr) = $bln; 
	$stmt 	= $pdo->prepare($sql); 
	$stmt->execute(); 
	$penjualan[$bln] = $stmt->fetchAll(PDO::FETCH_ASSOC); 
}

Contoh diatas akan mengeksekusi perintah SQL sebanyak 12 kali yang tentu saja akan memberatkan, terlebih lagi jika datanya sangat besar.

Untuk optimasi, salah satunya dapat ditempuh dengan membuat query di dalam loop kemudian mengeksekusinya di luar loop yang tentu saja akan menyebabkan penulisan query yang berbeda, untuk pembahasan lebih detailnya akan dibahas di tulisan lainnya (semoga).

3 Berhati – hati dalam penulisan nested loop

Terkadang kita menuliskan banyak loop di dalam loop, untuk kehati-hatian, gunakan variabel yang mencerminkan kondisi yang ada, tidak sekedar $i, mengingat nilai variabel akan berubah jika kita mendefinisikan dengan nama yang sama (baik sengaja maupun tidak), contoh berikut akan menghasilkan

*
**
***
****
*****

<?php
for ($row = 1; $row <= 5; $row++)
{
    for ($col = 1; $col <= $row; $col++)
    {
        echo '*' . '<br/>';
    }
}
?>

Berkreasi dengan loop

Penggunaan loop sangat luas sekali bisa untuk berbagai macam kebutuhan, saya ingin sharing contoh loop yang saya buat beberapa waktu lalu berupa karakter yang membentuk bidang persegi / segitiga yang dapat disusun menjadi suatu motif tertentu, agar artikel tidak terlalu panjang, silakan klik disini untuk membacanya

Demikian tutorial mengenai perulangan for pada PHP, semoga dapat bermanfaat.

Recomended Post

24 Feedback dari pembaca

  • mas kalo ada soal seperti ini :
    keluarga A terdiri dari A1, A2, A3, A4, A5, A6, A7 – n
    terus nanti tampilannya menjadi :
    Keluarga A yaitu A1 dan A2 dan A3 dan A4 – n
    tetapi perintah perulangannya dijadikan variabel
    contoh :

    for($i = 0 ; $i < count($a) ; $i++)
    {
          echo "Keluarga A yaitu";
          if($a == 0)
          { echo $a[$i];  }
          else
          {  echo " dan ".$a; }
    }
    

    tapi hasilnya jadi variabel aja gitu bisakah ? (ex : $hasil = for($i = 0 ; $i < count($a) ; $i++){})

    coba nilainya disimpan ke variabel mas

    • Iya mbak memang seperti itu:
      Coba seperti ini:

      <?php
      for($angka = 1; $angka <= 5; $angka++) 
      {
      	for ($diulang = 0; $diulang < $angka; $diulang++) {
      		echo $angka;
      	}
      	echo ' ';
      }

      Hasil: 1 22 333 4444 5555

      Coba pelajari ini:

      // ketika $angka = 1;
      for ($diulang = 0; $diulang < 1; $diulang++) {
      	echo 1;
      }
      echo ' ';
      // output 1[spasi]
      
      // ketika $angka = 2;
      for ($diulang = 0; $diulang < 2; $diulang++) {
      	echo 2; hasil 22;
      }
      echo ' ';
      Output 22[spasi]
      
      dst..
      
      Jika digabung output 1[spasi]22[spasi]... dst

      atau bisa email saya mbak

  • Gan kan kalo script kayak kini

    <?php
    $n=1;
    while ($n<=5)
    {
            for ($n2=1; $n2<=$n; $n2++)
            {
                   echo $n;
             }
             echo "";
              $n++;
    }
    

    Maka akan menampilkan di browser seperti ini..

    1
    22
    333
    4444
    55555
    

    Nah saya mau nanya gan , kalo mau menampilkan yg seperti ini

    1
    22
    333
    4444
    55555
    55555
    4444
    333
    22
    1
    

    Itu gimana caranya ya gan ,dengan menggabungkan while dan for ?

    • Kenapa ngga dibalik saja mas?

      $n=1;
      while ($n<=5) {
      	for ($n2=1; $n2<=$n; $n2++) {
      		echo $n;
      	}
      	echo '<br/>';
      	$n++;
      }
      $n = 5;
      while ($n >= 1) {
      	for ($n2=1; $n2<=$n; $n2++) {
      		echo $n;
      	}
      	echo '<br/>';
      	$n--;
      }

      Atau jika digabung:

      <?php
      $n = 1;
      $max = 5;
      $increment = $decrement = '';
      while ($n <= $max) 
      {
      	for ($n2=1; $n2<=$n; $n2++) {
      		$increment .= $n;
      	}
      	$increment .= '<br/>';
      	
      	for ($n2 = $max; $n2>=$n; $n2--) {
      		$decrement .= $max + 1 - $n;
      	}
      	$decrement .= '<br/>';
      	
      	$n++;
      }
      echo $increment . $decrement;

      Hasilnya akan sama

  • sore mas agung
    makash sebelumnya udah sering bantu 🙂
    mau tanya lagi cuman g tau pas g tau engga sama temanya hehe
    maap kalau g sesuai temanya
    di database ada 3 tabel
    tb_produk, tb_detail_produk, tb_bahan

    tb_produk
    |id_produk|nama_produk  |stok_p|
    |1        |tiang infus  |50    |
    
    tb_bahan
    |id_bahan|nama_bahan|stok_b|
    |1       | baud     |50    |
    |2       | tiang    |20    |
    |4       | roda     |20    |
    
    tb_detail_produk
    |id_detail|id_produk|id_bahan|kebutuhan|
    |1        | 1       | 1      |8        |
    |2        | 1       | 2      |1        |
    |3        | 1       | 4      |1        |
    

    mau tanya mas cara melakukan pengulangan perubahan semua stok pada tabel bahan yang tertara di tabel detail produk
    soalnya kalo update kaya skrip ini

    $baru=mysql_query("update bahan set stok_b= $rbb
    		where id_bahan=$id_bahan "); 
    

    yg ke update cuman 1 line ga smua yang tertara di tabel detail
    map kalo kata”nya bikin bingung

    $id_bahan nya di dapet dari sini mas

    $bb1 =mysql_query("SELECT bah.*, 
    						detail.*
    						from detail_produk detail
    						left join bahan  bah on bah.id_bahan = detail.id_bahan 
    						where id_produk=$id_produk ");
    $det=mysql_fetch_array($bb1);
    $id_bahan=$det['id_bahan'];
    

    • Ini maksudnya mau mengupdate tabel bahan sesuai dengan data pada tabel detail ya mas?
      Jika demikian, coba query ini mas:

      UPDATE tb_bahan SET stok_b = (
      				SELECT stok_b - kebutuhan 
      				FROM tb_detail_produk 
      				WHERE id_bahan = tb_bahan.id_bahan
      			);

      Di PHP:

      <?php
      $conn =mysqli_connect('localhost', 'root', '', 'test');
      $query = mysqli_query($conn, "UPDATE tb_bahan SET stok_b = (
      							SELECT stok_b - kebutuhan 
      							FROM `tb_bahan` 
      							LEFT JOIN tb_detail_produk USING(id_bahan)
      							WHERE id_bahan = tb_bahan.id_bahan
      						)"
      			);

    • Coba ini mbak, tinggal diganti nilai variabel $max nya

      <?php
      $max = 10;
      for ($i=0; $i < $max; $i++)
      {
      	for ($j = $max-$i; $j <= $max; $j++)
      	{
      		echo $j;
      	}
      	echo '<br/>';
      }

      Hasil:

      10
      910
      8910
      78910
      678910
      5678910
      45678910
      345678910
      2345678910
      12345678910

  • saya punya kasus gan. api key youtube saya, ingin otomatis bergantian setiap jam nya. jam 12 malam – 1 malam.. nanti jam 1 sampai jam 2 mlm, ganti kode lagi. begitu seterusnya sampai 24 jam.
    misalkan
    $config[‘youtube’][‘api_key’] = array(“kodeApi1,kodeApi2,kodeApi3,kodeApi4,kodeApi5,kodeApi6,kodeApi7,kodeApi8,kodeApi9,kodeApi10,kodeApi11,kodeApi12,kodeApi13,kodeApi14,kodeApi15,kodeApi16,kodeApi17,kodeApi18,kodeApi19,kodeApi20,kodeApi21,kodeApi22,kodeApi23,kodeApi24”);
    if (!isset($_SESSION[‘regionCode’]))

    kodeApi1 untuk jam 12 pagi- 1 pagi
    kodeApi2 untuk jam 1pagi – jam 2pagi.
    begitu seterusnya gan. saya bingung dengan kode script nya.
    mohon bantuannya gan

    • Coba menggunakan if kemudian cek tanggal servernya mas, misal seperti ini:

      $jam = date('G');
      for ($i=1; $i <= 24; $i++) {
      	if ($jam < $i) { // jam 0 s.d 1
      		$config['youtube']['api_key'][$i-1];
      		break;
      	}
      }

      Jika jam misal menunjukkan angka 1, menit berapapun, sebelum jam 2:00:00, gunakan $config[‘youtube’][‘api_key’][1];

Silakan tinggalkan komentar

Like Us

Dapatkan update artikel terbaru via E-Mail
  1. Eksklusif Cheat Sheet PHP Bahasa Indonesia – Pendamping Belajar PHP

  2. PHP FORM III: Menampilkan Data MySQL Dengan PHP dan Form HTML

  3. Tutorial PHP Form II: Menampilkan Hasil Input Form HTML dengan PHP

  4. Tutorial PHP Form I: Menghubungkan Form HTML dengan PHP

  5. Menampilkan Data Dari Beberapa Tabel MySQL – JOIN Pada MYSQL

  6. Memahami dan Menampilkan Tanggal dan Waktu Pada PHP

  7. Menghitung Selisih Waktu Dengan PHP – Cara Termudah

  8. Memahami Fungsi Date Pada PHP

  9. Memahami Fungsi Time, Strtotime, dan Mktime Pada PHP – Memanipulasi Waktu

  10. Memahami Zona Waktu (Timezone) dan Selisih Waktu Pada PHP