Bir dizenin boş olup olmadığını kontrol eden bir işlev neden her zaman doğru döndürür? [kapalı]


231

Dize boş değilse true ve dize boşsa false döndüren bir işlevi isNotEmpty var. İçinden boş bir dize geçirirsem işe yaramadığını öğrendim.

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

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

    return false;
}

Dizenin isNotEmpty kullanılarak doğrulanması yapılır:

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

Dize boş ise, başka yürütmez, neden anlamıyorum, birisi lütfen bu biraz ışık tutabilir lütfen.


55
Sadece bir öneri: reddedilen adlara sahip işlevleri kullanmak genellikle kötü bir uygulamadır. İsEmpty ($ input) işlevine sahip olmak daha okunabilirdir, aksi takdirde şöyle çağırabilirsiniz: if (! İsNotEmpty ($ x)) ... Öte yandan, isNotEmpty () ve (! İsEmpty ()) bu farklı. YMMV.
johndodo

1
Olumsuz bir ad olmadan aynı işleve sahip olmak, belki hasContent () gibi bir şey.
OsakaWebbie

! thatDifferent @johndodo
coderatchet

Bu kesinlikle bir konu dışı: Yazım hatası sorusu.
mickmackusa

Yanıtlar:


320

Aslında basit bir problem. Değişiklik:

if (strTemp != '')

için

if ($strTemp != '')

Muhtemelen bunu şu şekilde değiştirmek de isteyebilirsiniz:

if ($strTemp !== '')

çünkü != ''geçerseniz sayısal 0 ve PHP'nin otomatik tür dönüşümü nedeniyle birkaç durum daha doğrudur .

Sen olmamalıdır yerleşik kullanmak boş () Bunun için fonksiyonu; yorumları ve PHP türü karşılaştırma tablolarını inceleyin .


4
Tartışmalı olarak if değerini şu şekilde değiştirin: return $ strTemp! == '';
strager

12
boş () kullanmak istemezsiniz. Bir dizi boşluk düşünün: $ x = ""; var_dump (boş ($ x)!); / * (DOĞRU) / var_dump (isNotEmpty ($ x)); / (YANLIŞ) * /
nickf

5
OP ipi kesiyor. Bu durumda uygundur.
cletus

8
@cletus: sonra $ s = '0' dizesini göz önünde bulundurun. Boş ($ s) olarak adlandırırsanız, true (sezgisel değil imho değil) olarak değerlendirilir.
johndodo

28
Boş () kullanmayın! empty (), '0' gibi değerler için true değerini döndürür. Bkz. Php.net/manual/tr/types.comparisons.php
Scott Tesler

27

PHP empty() test denilen yerleşik bir işlevi var if(empty($string)){...} Referans php.net: php boş yazarak yapılır


4
boş referans zaten cletus'tan kabul edilen cevabın sonunda. Ayrıca bu soru ve cevap dizisinin Nisan 2009'dan da olduğunu görün. Her neyse girdiniz için teşekkürler. İlk cevap için size +1 veriyorum.
regilero

64
Boş () kullanmayın! empty (), '0' gibi değerler için true değerini döndürür. Bkz. Php.net/manual/tr/types.comparisons.php
Scott Tesler

3
@ScottDavidTesler Dize "0" ise, doğru dönecek mi? Veya sadece 0 tamsayısı ise?
Tomas Zubiri

5
@TomasZubiri Evet, "0" içeren bir dize true değerini döndürür.
Michael Sund

3
LÜTFEN, kimse bu YANLIŞ cevabı onaylamıyor - yukarıdaki yorumları okuyun!
ToolmakerSteve

24

Ben her zaman boş bir dize, CGI / Perl gün ve Javascript ile geri kalma için düzenli bir ifade kullanın, bu yüzden neden PHP ile de değil, örneğin (denenmemiş olsa da)

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

\ S, boşluk olmayan herhangi bir karakteri temsil eder


1
Burada sıfırın boş bir dizeyle aynı olduğunu varsaymayan tek çözüm budur!
Matthew Lock

1
Serin çözüm. Bir yan not olarak, stackoverflow.com/a/4544642/5411817 bahseder: Varsayılan olarak .yeni satırlarla eşleşmez - [\s\S]bu soruna yönelik bir hack'tir. Bu JavaScript'te yaygındır, ancak PHP'de /snoktanın tüm karakterlerle eşleşmesi için bayrağı kullanabilirsiniz . Ve stackoverflow.com/a/4544646/5411817 bahseder: (?s)üzerinde dönüşler smodu ve (?-s)dönüşler kapalı ise. Bir kez kapatıldığında aşağıdakiler .bir satırsonu ile eşleşmez. regex bayrağı yerine anahtarı inline (regex içine gömülü) açmak / kapatmak istiyorsanız.
SherylHohman

19

Senin içinde ifişlev fıkra, bir değişkene bahsediyorsan strTempyok. $strTempyine de var.

Ancak PHP'nin zaten bir empty()işlevi var; neden kendin yapsın?

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

Php.net'ten:

Dönüş Değerleri

Var boş olmayan ve sıfır olmayan bir değere sahipse FALSE değerini döndürür.

Aşağıdaki şeyler boş olarak kabul edilir:

* "" (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
Tüm uygulamalar "0" ın boş olarak değerlendirilmesini istemez. Ve eğer isterse, if ($ x) karşılaştırmasını da kullanamaz mıydı yani If (! Trim ($ str))?
Calvin

1
$ TmpStr! = '' Yapmanın $ tmpStr öğesinin true değerini de döndüreceğini, 0 veya false değerini veya başka bir boş / false değerini içerdiğini unutmayın.
Pim Jager

5
Sürümünüz aslında çalışmaz: ifadelerde değil, değişkenlerde boş işler.
Hound

13

PHP, boş bir dizeyi false olarak değerlendirir, böylece şunları kullanabilirsiniz:

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

9
Siz pas 0'a kadar işe yarıyor. Aksi takdirde fikir harika, ben bunu başka yerlerde de yapacağım. Yanıtınız için teşekkürler.
bgosalci

10

Sadece strlen () işlevini kullanın

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

1
PHP'nin strlen () işlevini nasıl uyguladığına bağlıdır. Örneğin, Delphi'de dize aslında uzunluğunu eksi 4 bayt ofsetini saklamıştır, bu nedenle uzunluğunu kontrol etmek önemsizdir.
doctorlai

5
Save yazmayın. Önce Php 5.3fonksiyonu dönecektir 5eğer $stiptedir array. Php > 5.3bir istisna doğuracak. Kullanmanızı tavsiye ederim is_string($s) && str_len($s) > 0. >0sadece okuma amaçlıdır.
magic_al

5

Sadece kendi fonksiyonumu yazıyorum , tip kontrolü için is_string ve uzunluğu kontrol etmek için strlen .

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

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

İşte küçük bir test repl.it

DÜZENLE: Dizenin de boş olup olmadığını sınamak için trim işlevini de kullanabilirsiniz .

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

1

PHP boş bir alanı test etmek için gerekli ve kullanılan

ctype_space($tempVariable)

bu benim için iyi çalıştı.


Bu, farklı bir soruya doğru bir cevaptır. Bu cevap bir dizenin boş olup olmadığını kontrol ETMEZ.
mickmackusa

0

İşte dizenin boş olup olmadığını kontrol etmek için kısa bir yöntem.

$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
}

Kontrol edilmesi strlen()bu sayfada 2014 yılında tavsiye edilmiştir. Cevabınız yeni bir değer katmıyor.
mickmackusa

0

Sadece boole dökmek, sıfır işlemeyi unutma.

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)$stryapmakla aynıdır !empty($str)ve ile aynı sorunu vardır '0'. PHP Booleans , " Boole'ye dönüştürme" bölümünü okuyun . Ayrıca, geri aldın - olmalı !(bool)$string'. Veya işleviniz "isNotEmpty" olarak adlandırılmalıdır. Ne olursa olsun, '0'ın yanlış kullanımı ile sıkışıp kaldınız.
ToolmakerSteve

@ToolmakerSteve 0Sorun için döküm dizeyi döndürmeden önce bunu halledin . Ve çok teşekkürler, olumsuzlamayı unuttum !(olumsuz işlev adları kötü uygulama). Yayımımı düzenledi.
Fabian Picone

-1

Bu iş parçacığı oldukça eski olduğunu biliyorum ama sadece benim işlev birini paylaşmak istedim. Aşağıdaki bu işlev boş dizeleri, maksimum uzunlukta dizeleri, minimum uzunlukları veya tam uzunluğu kontrol edebilir. Boş dizeleri kontrol etmek istiyorsanız, $ min_len ve $ max_len değerlerini 0 olarak koymanız yeterlidir.

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

belki bunu deneyebilirsin

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

php.ini dosyasındaki php yapılandırmasından kaynaklanıyor


-2

seri_numara alanınız varsa ve boş olup olmadığını kontrol etmek istiyorsanız

$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'];
}

bu şekilde döngüdeki tüm dosyaları başka bir boş fonksiyonla kontrol edebilirsiniz.


empty()2009'da bu sayfada zaten tavsiye edildi.
mickmackusa

-2

bu, tam olarak aradığınız kısa ve etkili bir çözümdür:

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

Bunun işe yarayıp yaramadığını test etmedim, ancak eğer işe yararsa, nullkarşılaştırma için boş dizeye dönüştürerek olurdu . Bu durumda, ne demek istediğinizi söylemek çok daha açık olur $input > ''. Yani, "giriş dizesi ve boş bir dizgi arasında sözcüksel karşılaştırma yapın". Ya uçta boşluk görmezden: trim($input) > ''.
ToolmakerSteve

... Ayrıca ne olur testine gerek $inputolduğunu '0'. İlk argüman sayısal bir dize olduğunda, php'nin bir numericveya lexicalkarşılaştırma yapıp yapmadığı açık değildir .
ToolmakerSteve

-3

Bir cevabın var ama senin durumunda

return empty($input);

veya

return is_string($input);

5
bu başarısızempty("0")
activatedgeek

2
@geekido - yanlış yanıtları küçültmek StackOverflow'un bir parçasıdır - bu yanıtları aşağı taşır ve yanıtlayanları yanıtlarını düzeltmeye veya kaldırmaya teşvik eder. Cevabınızdaki sorunun ne olduğunu anlıyor musunuz? 1. empty- bu cevap zaten verilmiştir, bu yüzden tekrar söylemek hiçbir şey katmaz. Daha kötüsü, yorumlarda tartışıldığı gibi, yanlıştır - eşdeğer herhangi bir değer 0"boş" olarak kabul edilecektir. 2. is_stringfarklı bir şekilde yanlış - boş bir dize ''bir dizedir, bu nedenle bu durumda true değerini döndürür - soruyu sorduğunda başarısız olur.
ToolmakerSteve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.