Dlaczego funkcja sprawdzająca, czy łańcuch jest pusty, zawsze zwraca wartość true? [Zamknięte]


231

Mam funkcję isNotEmpty, która zwraca true, jeśli ciąg nie jest pusty, i false, jeśli ciąg jest pusty. Dowiedziałem się, że to nie działa, jeśli przepuszczę przez nią pusty ciąg.

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

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

    return false;
}

Sprawdzanie poprawności ciągu przy użyciu isNotEmpty odbywa się:

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

Jeśli łańcuch jest pusty, pozostałe nie wykonują się, nie rozumiem dlaczego. Czy ktoś mógłby rzucić nieco światła na ten temat?


55
To tylko sugestia: używanie funkcji o zanegowanych nazwach jest na ogół złą praktyką. Bardziej czytelna jest funkcja isEmpty ($ input), w przeciwnym razie możesz nazwać ją tak: if (! IsNotEmpty ($ x)) ... Z drugiej strony isNotEmpty () i (! IsEmpty ()) nie jest to inaczej. YMMV.
johndodo

1
Aby mieć tę samą funkcję bez zanegowanej nazwy, być może coś takiego jak hasContent ().
Osaka Webbe

! thatDifferent @johndodo
coderatchet

To jest ZAWSZE nietypowe pytanie : literówka .
mickmackusa

Odpowiedzi:


320

Właściwie prosty problem. Zmiana:

if (strTemp != '')

do

if ($strTemp != '')

Prawdopodobnie możesz również zmienić to na:

if ($strTemp !== '')

ponieważ != ''zwróci true, jeśli zdasz to 0 i kilka innych przypadków z powodu automatycznej konwersji typu PHP .

Nie należy do tego używać wbudowanej funkcji empty () ; zobacz komentarze i tabele porównawcze typów PHP .


4
Prawdopodobnie zmień if w: return $ strTemp! == '';
strager

12
nie chcesz używać empty (). Rozważ ciąg spacji: $ x = ""; var_dump (! empty ($ x)); / * (PRAWDA) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
OP przycina ciąg. W tym przypadku jest to właściwe.
cletus

8
@cletus: następnie rozważ ciąg $ s = '0'. Jeśli nazwiesz pustym ($ s), to będzie miało wartość true (nie intuicyjne imho, ale tak jest).
johndodo

28
Nie używaj pustego ()! Funkcja empty () zwróci wartość true dla wartości takich jak „0”. Zobacz php.net/manual/en/types.comparisons.php
Scott Tesler

27

PHP ma wbudowaną funkcję o nazwie empty() test jest wykonywany przez wpisanie if(empty($string)){...} odwołania php.net: php empty


4
puste odniesienie znajduje się już na końcu zaakceptowanej odpowiedzi ze strony cletus. Zobacz także, że ten wątek z pytaniami i odpowiedziami pochodzi z kwietnia 2009 r. W każdym razie dziękuję za Twój wkład. Daję ci +1 za pierwszą odpowiedź.
regilero

64
Nie używaj pustego ()! Funkcja empty () zwróci wartość true dla wartości takich jak „0”. Zobacz php.net/manual/en/types.comparisons.php
Scott Tesler,

3
@ScottDavidTesler Jeśli ciąg „0” zwróci wartość prawda? Czy tylko wtedy, gdy jest to liczba całkowita 0?
Tomas Zubiri,

5
@TomasZubiri Tak, ciąg zawierający „0” zwróci wartość true.
Michael Sund

3
PROSZĘ, nikt inny nie głosował za tą ZŁĄ odpowiedzią - przeczytaj powyższe komentarze!
ToolmakerSteve

24

Zawsze używam wyrażenia regularnego do sprawdzania pustego ciągu, pochodzącego z dni CGI / Perl, a także z Javascriptem, więc dlaczego nie z PHP, np. (Choć niesprawdzony)

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

Gdzie \ S oznacza dowolny znak inny niż biały


1
To jedyne rozwiązanie, które nie zakłada, że ​​zero jest takie samo jak pusty ciąg!
Matthew Lock

1
Fajne rozwiązanie. Na marginesie, stackoverflow.com/a/4544642/5411817 wspomina: Domyślnie .nie pasuje do nowych linii - [\s\S]to hack wokół tego problemu. Jest to powszechne w JavaScript, ale w PHP możesz użyć /sflagi, aby dopasować kropkę do wszystkich znaków. A stackoverflow.com/a/4544646/5411817 wspomina: (?s)włącza stryb i (?-s)wyłącza, jeśli jest wyłączony. Po wyłączeniu następujące elementy .nie będą pasować do nowej linii. jeśli chcesz włączyć / wyłączyć przełącznik inline (osadzony w wyrażeniu regularnym) zamiast jako flaga wyrażenia regularnego.
SherylHohman

19

W swojej ifklauzuli w funkcji masz na myśli zmienną strTemp, która nie istnieje. $strTempjednak istnieje.

Ale PHP ma już empty()dostępną funkcję; po co tworzyć własne?

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

Z php.net:

Zwracane wartości

Zwraca FAŁSZ, jeśli var ma niepustą i niezerową wartość.

Następujące rzeczy są uważane za puste:

* "" (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
Nie wszystkie implementacje chcą, aby „0” było oceniane jako puste. A jeśli tego chciał, to czy nie mógłby równie dobrze użyć porównania if ($ x), tj. If (! Trim ($ str))?
Calvin

1
Zauważ, że wykonanie $ tmpStr! = '' Zwróci również wartość true dla $ tmpStr zawiera 0 lub false lub inną pustą / fałszywą wartość.
Pim Jager

5
Twoja wersja faktycznie nie działa: puste działa na zmiennych, a nie na wyrażeniach.
Hound

13

PHP ocenia pusty ciąg znaków na false, więc możesz po prostu użyć:

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

9
Działa to dobrze, dopóki nie przejdziesz 0. W przeciwnym razie pomysł jest świetny, podam go w innych miejscach. Dzięki za twoją odpowiedź.
bgosalci

10

Wystarczy użyć funkcji strlen ()

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

1
zależy to od tego, jak PHP implementuje funkcję strlen (). Na przykład w Delphi łańcuch faktycznie zachował swoją długość minus 4 bajty przesunięcia, więc sprawdzenie jego długości jest banalne.
doctorlai,

5
Nie wpisz save. Zanim Php 5.3funkcja wróci, 5jeśli $sjest typu array. Php > 5.3powstanie wyjątek. Polecam używać is_string($s) && str_len($s) > 0. >0tylko do czytania.
magic_al

5

Po prostu piszę własną funkcję, is_string do sprawdzania typu i strlen do sprawdzania długości.

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

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

Oto mały testowy repl.it

EDYCJA: Możesz również użyć funkcji przycinania, aby sprawdzić, czy łańcuch jest również pusty.

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

1

Musiałem przetestować puste pole w PHP i użyć

ctype_space($tempVariable)

który działał dobrze dla mnie.


To poprawna odpowiedź na inne pytanie. Ta odpowiedź NIE sprawdza, czy ciąg znaków jest pusty.
mickmackusa

0

Oto krótka metoda sprawdzenia, czy łańcuch jest pusty, czy nie.

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

Sprawdzanie tego strlen()było zalecane w 2014 roku na tej stronie. Twoja odpowiedź nie wnosi żadnej nowej wartości.
mickmackusa

0

Możesz po prostu rzucić na bool, nie zapomnij obsługiwać zera.

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)$strto to samo co robienie !empty($str)i ma ten sam problem z '0'. Przeczytaj PHP Booleans , rozdział „Konwersja na boolean”. Poza tym masz to odwrotnie - powinno być !(bool)$string'. Lub twoja funkcja powinna mieć nazwę „isNotEmpty”. Niezależnie od tego, utkniesz w niewłaściwym traktowaniu „0”.
ToolmakerSteve

@ToolmakerSteve W przypadku 0problemu wystarczy poradzić sobie z tym przed zwróceniem rzutowanego łańcucha. I wielkie dzięki, zapomniałem negacji !(zanegowane nazwy funkcji są złą praktyką). Edytowałem mój post.
Fabian Picone

-1

Wiem, że ten wątek był dość stary, ale chciałem po prostu udostępnić jedną z moich funkcji. Ta funkcja poniżej może sprawdzić puste ciągi, ciągi o maksymalnej długości, minimalnej długości lub dokładnej długości. Jeśli chcesz sprawdzić puste ciągi, po prostu ustaw $ min_len i $ max_len jako 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

może możesz tego spróbować

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

wynika to z konfiguracji php w php.ini


-2

jeśli masz pole, a mianowicie numer_seryjny i chcesz zaznaczyć puste

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

w ten sposób możesz sprawdzić wszystkie pola w pętli za pomocą innej pustej funkcji


empty()był już polecany na tej stronie w 2009 roku.
mickmackusa

-2

to krótkie i skuteczne rozwiązanie, dokładnie to, czego szukasz:

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

Nie testowałem, czy to działa, ale jeśli tak, to byłoby to przez konwersję nulldo pustego łańcucha w celu porównania. W takim przypadku, byłoby znacznie wyraźniej powiedzieć, co to znaczy: $input > ''. Oznacza to, że „wykonaj leksykalne porównanie łańcucha wejściowego i łańcucha pustego”. Lub ignorować spacje na końcach: trim($input) > ''.
ToolmakerSteve

... Musisz także sprawdzić, co się stanie, kiedy $inputbędzie '0'. Nie jest jasne, czy php robi a numericczy lexicalporównanie, gdy pierwszy argument jest ciągiem liczbowym.
ToolmakerSteve

-3

Masz odpowiedź, ale w twoim przypadku możesz użyć

return empty($input);

lub

return is_string($input);

5
to nie powiedzieempty("0")
activatedgeek

2
@geekido - zaniżanie błędnych odpowiedzi jest częścią StackOverflow - przesuwa te odpowiedzi w dół i zachęca ankieterów do poprawienia lub usunięcia odpowiedzi. Czy rozumiesz, co jest nie tak z twoją odpowiedzią? 1. empty- ta odpowiedź została już udzielona, ​​więc jej powtórzenie nic nie wnosi. Co gorsza, jak zostało to omówione w komentarzach, jest błędne - każda wartość równoważna 0zostanie uznana za „pustą”. 2. is_stringjest zły w inny sposób - pusty ciąg ''jest ciągiem, więc w takim przypadku zwróci true - nie robi tego, o co pyta pytanie.
ToolmakerSteve
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.