PHP & MySQLi: Menggabungkan Dua Array dan Menjumlahkan Nilainya

3 November 2012

Saya punya dua buah table dalam satu database. Table pertama adalah data stok yang berisi data jumlah barang di setiap cabangnya, namun kode cabang dan jumlah barang tersebut saya simpan dalam satu kolom table yang dipisahkan dengan tanda koma.

Hasil query dari table pertama seperti berikut.

mysql> SELECT kode_barang, kode_cabang, qty FROM stok WHERE kode_barang in ('0100200001', '0100200002');
+-------------+--------------------------+-----------+
| kode_barang | kode_cabang              | qty       |
+-------------+--------------------------+-----------+
| 0100200001  | CAB1,CAB2,CAB3,CAB4,CAB5 | 1,1,6,1,1 |
| 0100200002  | CAB1,CAB2,CAB3,CAB4,CAB5 | 0,0,6,0,0 |
+-------------+--------------------------+-----------+

Table kedua berisi data stok “masuk”. Contoh query data yang baru masuk adalah:

mysql> SELECT kode_barang, kode_cabang, qty FROM penerimaan WHERE kode_barang in ('0100200001', '0100200002');
+-------------+-------------+-----+
| kode_barang | kode_cabang | qty |
+-------------+-------------+-----+
| 0100200001  | CAB3        |   5 |
| 0100200002  | CAB3        |   6 |
+-------------+-------------+-----+

Hasil table kedua ini ingin saya gabungkan dengan table pertama, yaitu menambahkan data masuk CAB3 ke data stok khusus untuk CAB3. Hasil yang diinginkan adalah menambahkan jumlah barang yang baru masuk untuk CAB3 pada table pertama, seperti berikut:

+-------------+--------------------------+------------+
| kode_barang | kode_cabang              | qty        |
+-------------+--------------------------+------------+
| 0100200001  | CAB1,CAB2,CAB3,CAB4,CAB5 | 1,1,11,1,1 |
| 0100200002  | CAB1,CAB2,CAB3,CAB4,CAB5 | 0,0,12,0,0 |
+-------------+--------------------------+------------+

Untuk menghasilkan array pada PHP berdasarkan “kode_cabang” dan “qty” dari table pertama disimpan ke dalam variable array “data_a” adalah:

<?php
$db = new mysqli('localhost', 'root', '', 'namadatabase');

$query = $db->query("SELECT kode_barang, kode_cabang, qty FROM stok WHERE kode_barang in ('0100200001', '0100200002')");

while ($item = $query->fetch_assoc()) :
	$kode_cabang = explode(',', $item['kode_cabang']);
	$qty = explode(',', $item['qty']);
	$data_a[$item['kode_barang']] = array_combine($kode_cabang, $qty);
endwhile;

Hasil array dari looping PHP dari table stok di atas adalah:

Array
(
    [0100200001] => Array
        (
            [CAB1] => 1
            [CAB2] => 1
            [CAB3] => 6
            [CAB4] => 1
            [CAB5] => 1
        )
    [0100200002] => Array
        (
            [CAB1] => 0
            [CAB2] => 0
            [CAB3] => 6
            [CAB4] => 0
            [CAB5] => 0
        )
)

Pada tabel kedua, yang berisi data barang masuk pada PHP disimpan ke dalam variable array “data_b”, seperti berikut:

$query = $db->query("SELECT kode_barang, kode_cabang, qty FROM masuk WHERE kode_barang IN ('0100200001', '0100200002')");

while ($item = $query->fetch_assoc()) :
	$data_b[$item['kode_barang']][$item['kode_cabang']] = $item['qty'];
endwhile;

Hasil array dari variable “data_b” adalah:

Array
(
    [0100200001] => Array
        (
            [CAB3] => 5
        )

    [0100200002] => Array
        (
            [CAB3] => 6
        )
)

Dari array “data_b” ini saya ingin menjumlahkan angka 5 dan 6 ke data stok untuk CAB3 saja. Di PHP, tersedia fungsi untuk menggabungkan array secara recursive yaitu fungsi “array_merge_recursive”. Namun, setahu saya, belum tersedia fungsi untuk menggabungkan dan menjumlahkan hasil dari kedua array di atas secara recursive, jadi perlu fungsi baru untuk itu.

function array_merge_recursive_sum()
{
	$arrays = func_get_args();
	$base = array_shift($arrays);
	foreach ($arrays as $array) :
		reset($base);
		while (list($key, $value) = @each($array)) :
			if (is_array($value) && @is_array($base[$key])) :
				$base[$key] = array_merge_recursive_sum($base[$key], $value);
			else :
				$base[$key] += $value;
			endif;
		endwhile;
	endforeach;
	return $base;
}

Fungsi di atas dapat diperoleh dari situs manual PHP dengan sedikit modifikasi.

Dengan menggunakan fungsi baru di atas, kita buat sebuah variable baru untuk menggabungkan jumlah qty dari kedua array “data_a” dan “data_b”.

$gabung = array_merge_recursive_sum($data_a, $data_b);

Hasil penggabungan data dari variable “$gabung” di atas adalah:

Array
(
    [0100200001] => Array
        (
            [CAB1] => 1
            [CAB2] => 1
            [CAB3] => 11
            [CAB4] => 1
            [CAB5] => 1
        )

    [0100200002] => Array
        (
            [CAB1] => 0
            [CAB2] => 0
            [CAB3] => 12
            [CAB4] => 0
            [CAB5] => 0
        )
)

Tampak pada CAB3 terjadi penjumlahan table data stok dengan table data penerimaan dari kedua table di atas. Pada tulisan berikutnya akan saya tampilkan bagaimana memasukkan data dari table “penerimaan” ke dalam table stok.

Seluruh kode PHP di atas saya gabungkan di bawah ini:

<?php
// koneksi ke database menggunakan mysqli.
$db = new mysqli('localhost', 'root', '', 'namadatabase');

// query table pertama untuk mengambil data stok awal.
$query = $db->query("SELECT kode_barang, kode_cabang, qty FROM stok WHERE kode_barang in ('0100200001', '0100200002')");

while ($item = $query->fetch_assoc()) :
	$kode_cabang = explode(',', $item['kode_cabang']);
	$qty = explode(',', $item['qty']);
	$data_a[$item['kode_barang']] = array_combine($kode_cabang, $qty);
endwhile;

// query table kedua kedua untuk mengambil data barang yang baru masuk.
$query = $db->query("SELECT kode_barang, kode_cabang, qty FROM masuk WHERE kode_barang IN ('0100200001', '0100200002')");

while ($item = $query->fetch_assoc()) :
	$data_b[$item['kode_barang']][$item['kode_cabang']] = $item['qty'];
endwhile;

$gabung = array_merge_recursive_sum($data_a, $data_b);

/* 
fungsi untuk menggabungkan kedua array dari hasil 
kedua table di atas secara recursive 
dan menjumlahkan nilai quantity
*/

function array_merge_recursive_sum()
{
	$arrays = func_get_args();
	$base = array_shift($arrays);
	foreach ($arrays as $array) :
		reset($base);
		while (list($key, $value) = @each($array)) :
			if (is_array($value) && @is_array($base[$key])) :
				$base[$key] = array_merge_recursive_sum($base[$key], $value);
			else :
				$base[$key] += $value;
			endif;
		endwhile;
	endforeach;
	return $base;
}

Happy coding…

Iklan

4 Responses to “PHP & MySQLi: Menggabungkan Dua Array dan Menjumlahkan Nilainya”


  1. ASK
    bagaimana untuk input dan editnya mas jika strukturnya seperti diatas..
    saya lagi kebingungan mo bikin satu user beberapa group, model struktur fieldnya seperti tutorial diatas jadi pada table user > field Group terdapat data (1 | 2 | 3 )
    saya sudah coba implode tapi masih salah.. bisa dibantu mas

    • rp25rb Says:

      Input attribute ‘name’ pada tag input harus dikasih tanda square bracket ( [] ), misal: untuk setiap nama group yang dipilih. Untuk mengubah data seperti di atas, harus meng-explode data terlebih dahulu, sehingga terbentuk array baru. Data array inilah yang kemudian ditarik oleh form edit.

  2. roma Says:

    bagaimana menjumlahkan dari isi Array nya bukan total array melainkan total dar isi array nya mas

    • rp25rb Says:

      PHP sudah menyediakan fungsi array_sum, contoh:

      $arr = array(1, 2, 3);
      echo array_sum($arr);

      // hasil -> 6

      Jika seperti itu yang dimaksud đŸ™‚


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: