Mengapa fungsi memeriksa jika string kosong selalu mengembalikan true? [Tutup]


231

Saya memiliki fungsi isNotEmpty yang mengembalikan true jika string tidak kosong dan salah jika string kosong. Saya menemukan bahwa itu tidak berfungsi jika saya melewati string kosong melewatinya.

function isNotEmpty($input) 
{
    $strTemp = $input;
    $strTemp = trim($strTemp);

    if(strTemp != '') //Also tried this "if(strlen($strTemp) > 0)"
    {
         return true;
    }

    return false;
}

Validasi string menggunakan isNotEmpty dilakukan:

if(isNotEmpty($userinput['phoneNumber']))
{
    //validate the phone number
}
else
{
    echo "Phone number not entered<br/>";
}

Jika string kosong, yang lain tidak dieksekusi, saya tidak mengerti mengapa, bisakah seseorang tolong jelaskan hal ini?


55
Hanya saran: umumnya merupakan praktik yang buruk untuk menggunakan fungsi dengan nama yang dinegasikan. Lebih mudah dibaca memiliki fungsi isEmpty ($ input), jika tidak Anda bisa menyebutnya seperti ini: if (! IsNotEmpty ($ x)) ... Di sisi lain, isNotEmpty () dan (! IsEmpty ()) tidak berbeda. YMMV.
johndodo

1
Untuk memiliki fungsi yang sama tanpa nama yang dinegasikan, mungkin sesuatu seperti hasContent ().
OsakaWebbie

! thatDifferent @johndodo
coderatchet

Ini PASTI merupakan Off-topic: Typo question.
mickmackusa

Jawaban:


320

Sebenarnya masalah sederhana. Perubahan:

if (strTemp != '')

untuk

if ($strTemp != '')

Mungkin Anda juga ingin mengubahnya menjadi:

if ($strTemp !== '')

karena != ''akan mengembalikan true jika Anda lulus adalah angka 0 dan beberapa kasus lain karena konversi jenis otomatis PHP .

Anda seharusnya tidak menggunakan fungsi built-in empty () untuk ini; lihat komentar dan tabel perbandingan jenis PHP .


4
Bisa dibilang, ubah if menjadi: return $ strTemp! == '';
strager

12
Anda tidak ingin menggunakan kosong (). Pertimbangkan serangkaian spasi: $ x = ""; var_dump (! empty ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
OP sedang memotong tali. Dalam hal ini sesuai.
cletus

8
@cletus: lalu pertimbangkan string $ s = '0'. Jika Anda memanggil kosong ($ s) itu akan mengevaluasi true (bukan imho intuitif, tetapi memang demikian).
johndodo

28
Jangan gunakan kosong ()! kosong () akan mengembalikan nilai true seperti '0'. Lihat php.net/manual/en/types.comparisons.php
Scott Tesler

27

PHP memiliki fungsi bawaan empty() yang disebut tes ini dilakukan dengan mengetikkan if(empty($string)){...} Referensi php.net: php kosong


4
referensi kosong sudah ada di akhir jawaban yang diterima dari cletus. Lihat juga bahwa utas pertanyaan dan jawaban ini berasal dari April 2009. Pokoknya terima kasih atas masukan Anda. Saya memberi Anda +1 untuk jawaban pertama.
regilero

64
Jangan gunakan kosong ()! kosong () akan mengembalikan nilai true seperti '0'. Lihat php.net/manual/en/types.comparisons.php
Scott Tesler

3
@ScottDavidTesler Jika string adalah "0" apakah akan mengembalikan true? Atau hanya jika itu adalah bilangan bulat 0?
Tomas Zubiri

5
@TomasZubiri Ya, string yang berisi "0" akan kembali benar.
Michael Sund

3
TOLONG, tidak ada orang lain yang mengangkat jawaban yang SALAH ini - baca komentar di atas!
ToolmakerSteve

24

Saya selalu menggunakan ekspresi reguler untuk memeriksa string kosong, dating kembali ke CGI / Perl hari, dan juga dengan Javascript, jadi mengapa tidak dengan PHP juga, misalnya (walaupun belum teruji)

return preg_match('/\S/', $input);

Di mana \ S mewakili karakter non-spasi putih


1
Ini adalah satu-satunya solusi di sini yang tidak menganggap nol sama dengan string kosong!
Matthew Lock

1
Solusi keren Sebagai catatan tambahan, stackoverflow.com/a/4544642/5411817 menyebutkan: Secara default .tidak cocok dengan baris baru - [\s\S]adalah peretas di sekitar masalah itu. Ini umum dalam JavaScript, tetapi dalam PHP Anda dapat menggunakan /sbendera untuk membuat titik cocok dengan semua karakter. Dan stackoverflow.com/a/4544646/5411817 menyebutkan: (?s)menyalakan smode dan (?-s)mematikan jika mati. Setelah dimatikan, setiap pengikut .tidak akan cocok dengan baris baru. jika Anda ingin menghidupkan / mematikan sakelar inline (disematkan di dalam regex) alih-alih sebagai flag regex.
SherylHohman

19

Di ifklausa Anda dalam fungsi, Anda merujuk ke variabel strTempyang tidak ada. $strTempmemang ada.

Tetapi PHP sudah memiliki empty()fungsi yang tersedia; mengapa membuat sendiri?

if (empty($str))
    /* String is empty */
else
    /* Not empty */

Dari php.net:

Nilai Pengembalian

Mengembalikan FALSE jika var memiliki nilai yang tidak kosong dan tidak nol.

Hal-hal berikut dianggap kosong:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

http://www.php.net/empty


11
Tidak semua implementasi ingin "0" dievaluasi sebagai kosong. Dan jika dia menginginkannya, tidak bisakah dia menggunakan perbandingan if ($ x) yaitu If (! Trim ($ str))?
Calvin

1
Perhatikan bahwa melakukan $ tmpStr! = '' Juga akan mengembalikan true dari $ tmpStr yang menyimpan 0 atau false atau nilai kosong / salah lainnya.
Pim Jager

5
Versi Anda tidak akan benar-benar berfungsi: kosong berfungsi pada variabel, bukan pada ekspresi.
Hound 7-10

13

PHP mengevaluasi string kosong menjadi false, sehingga Anda dapat menggunakan:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}

9
Ini berfungsi dengan baik sampai Anda pas 0. Jika idenya bagus, saya akan menggunakannya di beberapa tempat lain. Terimakasih atas tanggapan Anda.
bgosalci

10

Cukup gunakan fungsi strlen ()

if (strlen($s)) {
   // not empty
}

1
itu tergantung pada bagaimana PHP mengimplementasikan fungsi strlen (). Sebagai contoh, dalam Delphi, string sebenarnya telah menyimpan panjangnya dikurangi 4 byte offset, jadi memeriksa panjangnya sepele.
doctorlai

5
Bukan tipe save. Sebelum Php 5.3fungsi akan kembali 5jika $sbertipe array. Php > 5.3akan muncul pengecualian. Saya sarankan menggunakan is_string($s) && str_len($s) > 0. >0hanya untuk tujuan membaca.
magic_al

5

Saya hanya menulis fungsi saya sendiri, is_string untuk memeriksa jenis dan strlen untuk memeriksa panjang.

function emptyStr($str) {
    return is_string($str) && strlen($str) === 0;
}

print emptyStr('') ? "empty" : "not empty";
// empty

Inilah tes kecil repl.it

EDIT: Anda juga dapat menggunakan fungsi trim untuk menguji apakah string juga kosong.

is_string($str) && strlen(trim($str)) === 0;    

1

Saya perlu menguji bidang kosong di PHP dan digunakan

ctype_space($tempVariable)

yang bekerja dengan baik untuk saya.


Ini adalah jawaban yang benar untuk pertanyaan yang berbeda. Jawaban ini TIDAK memeriksa apakah string kosong.
mickmackusa

0

Nah di sini adalah metode singkat untuk memeriksa apakah string kosong atau tidak.

$input; //Assuming to be the string


if(strlen($input)==0){
return false;//if the string is empty
}
else{
return true; //if the string is not empty
}

Memeriksa strlen()direkomendasikan pada 2014 di halaman ini. Jawaban Anda tidak menambah nilai baru.
mickmackusa

0

Anda bisa langsung melakukan bool, jangan lupa untuk menangani nol.

function isEmpty(string $string): bool {
    if($string === '0') {
        return false;
    }
    return !(bool)$string;
}

var_dump(isEmpty('')); // bool(true)
var_dump(isEmpty('foo')); // bool(false)
var_dump(isEmpty('0')); // bool(false)

(bool)$strsama dengan melakukan !empty($str), dan memiliki masalah yang sama dengan '0'. Baca PHP Booleans , bagian "Konversi ke boolean". Juga, Anda mendapatkannya mundur - seharusnya !(bool)$string'. Atau fungsi Anda harus dinamai "isNotEmpty". Apapun, Anda terjebak dengan penanganan yang salah dari '0'.
ToolmakerSteve

@ToolmakerSteve Untuk 0masalah, hanya menangani itu sebelum mengembalikan string yang dicor. Dan terima kasih banyak, saya lupa negasi !(nama fungsi yang dinegasikan adalah praktik buruk). Mengedit pos saya.
Fabian Picone

-1

Saya tahu utas ini sudah sangat lama tetapi saya hanya ingin berbagi salah satu fungsi saya. Fungsi di bawah ini dapat memeriksa string kosong, string dengan panjang maksimum, panjang minimum, atau panjang tepat. Jika Anda ingin memeriksa string kosong, cukup masukkan $ min_len dan $ max_len sebagai 0.

function chk_str( $input, $min_len = null, $max_len = null ){

    if ( !is_int($min_len) && $min_len !== null ) throw new Exception('chk_str(): $min_len must be an integer or a null value.');
    if ( !is_int($max_len) && $max_len !== null ) throw new Exception('chk_str(): $max_len must be an integer or a null value.'); 

    if ( $min_len !== null && $max_len !== null ){
         if ( $min_len > $max_len ) throw new Exception('chk_str(): $min_len can\'t be larger than $max_len.');
    }

    if ( !is_string( $input ) ) {
        return false;
    } else {
        $output = true;
    }

    if ( $min_len !== null ){
        if ( strlen($input) < $min_len ) $output = false;
    }

    if ( $max_len !== null ){
        if ( strlen($input) > $max_len ) $output = false;
    }

    return $output;
}

-2

mungkin kamu bisa coba ini

if(isNotEmpty($userinput['phoneNumber']) == true)

itu karena konfigurasi php di php.ini


-2

jika Anda memiliki bidang yaitu serial_number dan ingin memeriksa kosong maka

$serial_number = trim($_POST[serial_number]);
$q="select * from product where user_id='$_SESSION[id]'";
$rs=mysql_query($q);
while($row=mysql_fetch_assoc($rs)){
if(empty($_POST['irons'])){
$irons=$row['product1'];
}

dengan cara ini Anda dapat chek semua file dalam loop dengan fungsi kosong lainnya


empty()sudah direkomendasikan di halaman ini pada tahun 2009.
mickmackusa

-2

ini adalah solusi singkat dan efektif, persis apa yang Anda cari:

return $input > null ? 'not empty' : 'empty' ;

Saya belum menguji apakah ini berfungsi, tetapi jika berhasil, itu akan dengan mengkonversi nullke string kosong untuk perbandingan. Dalam hal ini, itu akan menjadi jauh lebih jelas untuk mengatakan apa yang Anda maksud: $input > ''. Artinya, "melakukan perbandingan leksikal antara string input dan string kosong". Atau mengabaikan spasi di ujung: trim($input) > ''.
ToolmakerSteve

... Juga perlu tes apa yang terjadi ketika $inputadalah '0'. Tidak jelas apakah php melakukan numericatau lexicalmembandingkan, ketika argumen pertama adalah string numerik.
ToolmakerSteve

-3

Anda mendapat jawaban tetapi dalam kasus Anda, Anda dapat menggunakan

return empty($input);

atau

return is_string($input);

5
ini gagal untukempty("0")
activatedgeek

2
@geekido - menurunkan jawaban yang salah adalah bagian dari StackOverflow - menurunkan jawaban itu, dan mendorong penjawab untuk memperbaiki jawaban mereka, atau menghapusnya. Apakah Anda mengerti apa yang salah dengan jawaban Anda? 1. empty- jawaban ini telah diberikan, jadi mengatakannya lagi tidak berkontribusi apa pun. Lebih buruk, seperti yang telah dibahas dalam komentar, itu salah - nilai apa pun yang setara 0akan dianggap "kosong". 2. is_stringsalah dalam cara yang berbeda - string kosong ''adalah string, jadi akan mengembalikan true dalam kasus itu - gagal melakukan pertanyaan apa yang diajukan.
ToolmakerSteve
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.