• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Jaranguda

Belajar Mengajar

  • Home
  • Sponsor/Jasa
  • Tentang

False yang bikin kena PHP

Last Updated on 6 February 2020 By tommy Leave a Comment

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.

Tulisan menarik lainnya

  • PHP Menampilkan Karakter yang Tidak Kelihatan

    Suatu saat anda mungkin menemui kasus dimana sudah mencoba menggunakan (!empty($string) tetapi anda tetap mendapati…

  • Validasi Angka dengan Script PHP

    Contoh kasus kita mau validasi nomor rekening yang dimasukkan pengguna di dalam sistem yang dibangun,…

  • Membuat Password Generator dengan PHP

    Untuk membuat kombinasi password yang aman disarankan menggunakan huruf kecil, huruf besar, angka, dan karakter…

  • Menjalankan CLI Linux dari PHP

    Dari script PHP kita bisa mengakses CLI (command line interface) linux dengan fungsi shell_exec, dengan…

Filed Under: PHP

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Primary Sidebar

Pencarian

Tanya Jawab tentang DevOps SRE CPE, gabung di https://t.me/devopsindonesia

Terbaru

  • Cara Mengganti Port Screen Sharing macOS
  • Cara Menonaktifkan Pager di macOS
  • Cara Mengupdate Nama Apple silicon-as-a-Service Scaleway
  • Cara Force Delete Namespace di Kubernetes
  • Install PHP MariaDB di Mac Monterey

Komentar

  • mazda on Tutorial Lengkap Install Mail Server Postfix Dovecot MariaDB di CentOS 7
  • adi on Menggunakan Mikrotik Sebagai SSH Client
  • aris u on Solusi Simple Queue Mikrotik Tidak Berjalan
  • Bowo on Cara Mematikan SSID Molecool Balifiber
  • aris on Solusi Simple Queue Mikrotik Tidak Berjalan

Tulisan Populer

  • Password Router Huawei HG8245H5 Indihome 1.2m views
  • Password Terbaru ZTE F609 Indihome 784.5k views
  • Password Superadmin Huawei HG8245A 318.7k views
  • Cara Setting Manual Modem GPON ZTE F609 Indihome 273.1k views
  • Cara Setting Wireless ZTE F609 Indihome 257.2k views
  • Mengaktifkan Port LAN di Huawei HG8245 Indihome 169.9k views
  • Akses UseeTV Indihome via Wireless ZTE F609 156.8k views
  • Kemana Menghilangnya Saldo BCA 50 ribu 153.4k views
  • Cara Reset Password ZTE F609 Indihome 147.6k views
  • Cara Setting DHCP Server Modem/Router ZTE F609 113.6k views

Kategori

  • Delphi
  • dll
  • Gambas
  • Internet
  • Java
  • Lazarus
  • Linux
  • PHP
  • Review
  • Teknologi

Sponsor

kadal.id
carakami.com
kuotabisa.com
Untuk jadi sponsor, hubungi kita lewat halaman sponsor
© 2021. Jaranguda
  • Linux
  • PHP
  • Internet
  • Teknologi
  • Delphi
  • Gambas
  • Java