Kemarin tidak sengaja menemukan “bug”, yang sempat bikin bingung, mungkin karna tidak mengerti :). Scriptnya seperti ini
<?php $data = [0 => 'id', 1 => 'number', 2 => 'name', 3 => 'age']; var_dump($data); $remove = ['id', 'age']; foreach ($remove as $val) { $searchArray = array_search($val, $data); if($searchArray) { unset($data[$searchArray]); } } var_dump($data);
tujuan script diatas adalah setiap data yang ada di variable $remove
, di cek ke $data
. Bila ditemukan mana datanya akan dihilangkan. Bila script diatas dijalankan, var_dump yang kedua harusnya hanya berisi dua array [1 => 'number', 2 => 'name']
, tetapi hasilnya berbeda dari yang diharapkan. Untuk lebih jelasnya lihat output script dibawah ini
array(4) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" [3] => string(3) "age" } array(3) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" }
yang menjadi masalah disini adalah 0 => 'id'
, masih muncul walaupun sudah di unset dengan unset[0]
dari looping.
Awalnya saya mengira masalah ada di unset, tetapi bila manual di setting unsetnya hasilnya normal, baik dengan
<?php $data = [0 => 'id', 1 => 'number', 2 => 'name', 3 => 'age']; var_dump($data); unset($data[0]); unset($data[3]); var_dump($data);
hasilnya
array(4) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" [3] => string(3) "age" } array(2) { [1] => string(6) "number" [2] => string(4) "name" }
ataupun merubah script diatas dengan
<?php $data = [0 => 'id', 1 => 'number', 2 => 'name', 3 => 'age']; var_dump($data); $remove = ['id', 'age']; foreach ($remove as $val) { $searchArray = array_search($val, $data); if($searchArray) { // unset($data[$searchArray]); unset($data[0]); unset($data[3]); } } var_dump($data);
hasilnya sama dengan script diatas, waktu di set manual. Berikut ini hasilnya
array(4) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" [3] => string(3) "age" } array(2) { [1] => string(6) "number" [2] => string(4) "name" }
karena belum menemukan masalah yang sebenarnya ada dimana, kembali saya anggap masalah berapa di foreach
, untuk loopingnya saya ubah menjadi for
<?php $data = [0 => 'id', 1 => 'number', 2 => 'name', 3 => 'age']; var_dump($data); $remove = ['id', 'age']; $jumlahData = count($remove); for ($i=0; $i < $jumlahData ; $i++) { $searchArray = array_search($remove[$i], $data); if($searchArray) { unset($data[$searchArray]); } }
hasilnya masih sama
array(4) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" [3] => string(3) "age" } /tmp/b.php:26: array(3) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" }
akhirnya coba set array mulai dari 1
$data = [1 => 'id', 2 => 'number', 3 => 'name', 4 => 'age'];
hasilnya sesuai dengan yang diharapkan :D
array(4) { [0] => string(2) "id" [1] => string(6) "number" [2] => string(4) "name" [3] => string(3) "age" } array(2) { [1] => string(6) "number" [2] => string(4) "name" }
baru ngeh, masalahnya ada di $searchArray
, karena
if (expr) statement
expr bernilai boolean TRUE. Sedangkan 0
itu false. Beberapa nilai yang dianggap false di PHP
the boolean FALSE itself the integers 0 and -0 (zero) the floats 0.0 and -0.0 (zero) the empty string, and the string "0" an array with zero elements the special type NULL (including unset variables) SimpleXML objects created from empty tags
pada contoh kasus diatas, karena key ID bernilai integer 0
, maka tidak akan pernah menjalankan unset
. Nilai boolean dari 0 bisa ditest dengan
<?php var_dump((boolean) (int)0); ?> // hasilnya bool(false)
Solusinya
<?php $data = [0 => 'id', 1 => 'number', 2 => 'name', 3 => 'age']; var_dump($data); $remove = ['id', 'age']; foreach ($remove as $val) { $searchArray = array_search($val, $data); if(isset($searchArray)) { unset($data[$searchArray]); } } var_dump($data);
ada di isset
, isset
mengecek apakah variable itu sudah di set, asalhkan nilainya tidak NULL bernilai true, jadi cocok untuk digunakan disini.