Ako skontrolovať, či je premenná prázdna v php. PHP Cheat Sheet: FALSE, NULL a hodnoty s nimi spojené. Funkcia is_null () a jazykové konštrukcie isset () a empty ().

  • 03.11.2019

Ak pri práci s reťazcami potrebujete skontrolovať, či je reťazec prázdny, začiatočníci zvyčajne používajú funkciu strlen ()... Táto funkcia je dostatočne rýchla, pretože nerobí žiadne výpočty, iba vracia už známu dĺžku reťazca dostupnú v zval (PHP používa štruktúru C na ukladanie premenných). Ale všetky rovnaké, tk. strlen () je funkcia, je trochu pomalá, pretože pri volaní vyžaduje niekoľko akcií, ako je vyhľadávanie malých písmen a hašovacích tabuliek. V niektorých prípadoch môžete zvýšiť rýchlosť vykonávania kódu pomocou prázdne ()..., ale tiež prázdne () stále môžete trochu optimalizovať.

Vezmime si príklad napríklad kontrola cesty obrázkov, funkcia skontroluje, či je cesta prázdna, potom ju nahradí inou cestou, napríklad "images / noimage.jpg".

A tak sa celá úloha zúži na kontrolu, či je premenná typu string prázdna. Skúsme 4 spôsoby:

  • if (strlen ($ img_path)> 0)
  • if ($ img_path (0))
  • if (prázdne ($ img_path))
  • a ešte jeden spôsob, ako vydržať.

A tak napíšeme prvým spôsobom:

Funkcia check_image_path ($ img_path) (if (strlen ($ img_path)> 0) ($ img_path = "images / noimage.jpg";) return $ img_path;)

vykonáme testovanie, priemerný čas testu 1.43795800209 sek.

Trochu viac premýšľať... Môžete sa odvolávať na prvý znak riadku naraz a nie na celý riadok. Ak je prítomný prvý znak, reťazec nie je prázdny. Prvý znak v riadku je očíslovaný od "0".

Funkcia check_image_path ($ cesta k obrázku) (if ($ cesta k obrázku (0)) ($ cesta k obrázku = "images / noimage.jpg";) návrat $ cesta k obrázku;)

priemerný čas testu 1.19431300163 sek., 17 % hraného času

Skúsme teraz písať cez prázdne ():

Funkcia check_image_path ($ img_path) (if (prázdne ($ img_path)) ($ img_path = "images / noimage.jpg";) return $ img_path;)

priemerný čas testu 1.1341319084 sek., 5 % hraného času z predchádzajúceho príkladu

Teraz sa pozrime na predposledný a posledný príklad nad nami. Pozrime sa, ako sa to dá skombinovať. premýšľajte ... ako môžete ešte optimalizovať?

Funkcia check_image_path ($ img_path) (if (prázdne ($ img_path (0))) ($ img_path = "images / noimage.jpg";) return $ img_path;)

priemerný čas testu 1.07465314865 a opäť vyhral 5% času ...

Ako to funguje a prečo rýchlejšie. A tu $ img_path (0) vráti prvý znak ... a potom funkciu prázdne () kontroluje prázdny reťazec ... rozdiel oproti predchádzajúcemu príkladu je v tom, že funkcii sa odovzdá iba jeden znak, nie celý reťazec. Od prvého príkladu po posledný sme teda vyhrali 25% čas.

V PHP sa hodnoty FALSE a NULL a ich pridružené hodnoty líšia od toho, ako sú zvyčajne v iných jazykoch a majú svoje vlastné nezrejmé zvláštnosti.
Článok pojednáva o týchto funkciách.
Pre začiatočníkov môže byť užitočné vidieť úplný obraz, pre skúsených čitateľov - aktualizovať v pamäti, ak z mojej hlavy vyletela nejaká nuansa.

FALSE vo výkazoch If

Podľa dokumentácie PHP sú nasledujúce hodnoty po pretypovaní na booleovský typ FALSE:
  • samotná boolovská hodnota je FALSE
  • prázdny reťazec ("") a reťazec "0".
  • prázdne pole - pole ().
  • objekt s nulovými členskými premennými (iba v PHP 4, ktoré nie je zahrnuté v tomto článku)
  • špeciálne null (vrátane nenastavených premenných)
  • Objekty SimpleXML (nie sú zahrnuté v tomto článku)
To znamená, že ak sa takéto hodnoty prenesú do podmienky:
ak (...) ozvena „1“; inak echo „0“;
potom sa zobrazí reťazec "0".

Ak hodnota premennej nie je nastavená (nenastavená), môže byť tiež vydané varovanie. Pripomeňme, že varovanie v podmienke možno odstrániť napísaním @ pred premennú.

Napríklad:

Ak (@ $ undefVar) (...)
Ale by ste mali používať @ iba v extrémnych prípadoch, keď ste to dobre premysleli a neexistujú žiadne iné vhodné možnosti. Pozrite si funkciu isset ().

Funkcia is_null () a jazykové konštrukcie isset () a empty ().

is_null () vráti hodnotu TRUE iba pre premenné, ktorým nebola priradená žiadna hodnota alebo im bola priradená hodnota NULL.
isset () vráti jednu ku jednej opačné boolovské hodnoty v porovnaní s is_null ().
Ak premennej nie je priradená hodnota, potom is_null () tiež generuje varovanie "Nedefinovaná premenná", na rozdiel od isset (), ktoré negeneruje žiadne varovania.
Pripomeňme, že na odstránenie hodnoty premennej môžete použiť funkciu unset (). Na tento účel môžete tiež priradiť hodnotu NULL, aby ste sa vyhli varovaniam kompilátora pri pokuse o načítanie hodnoty premennej.

Upozorňujeme, že na rozdiel od premenných na prácu s konštantami musíte použiť definovanú konštrukciu ().

Reprezentácia reťazca

Pozrime sa na reťazcovú reprezentáciu falošných konštánt.
Napríklad zreťazenie konvertuje hodnoty na nasledujúce reťazce uvedené v tabuľke nižšie:

Podrobnejšie je téma prevodu na reťazce popísaná na oficiálnej stránke v časti Konverzia na reťazce.

Porovnávacie operátory

Prejdime k porovnávacím operátorom.
Všetky nepravdivé hodnoty, ako sa očakávalo, vrátia hodnotu true pri porovnaní s FALSE pomocou operátora "==".
Pri vzájomnom porovnávaní falošných reťazcov by ste sa však nemali spoliehať na prechodnosť.
Tu je úplná tabuľka na porovnanie falošných hodnôt (plus označuje prvky tabuľky, ktoré pri porovnaní pomocou operátora "! =" vrátia skutočnú hodnotu:

$ undef - premenná, ktorá nemá priradenú hodnotu

Z tabuľky možno vyvodiť niekoľko pekných záverov:
1. Ak vieme, že používame iba reťazce, tak ich môžeme ľahko porovnať a nemusíme sa báť, že "" (prázdny reťazec) sa bude rovnať "0".
2. Polia sa nikdy nerovnajú reťazcom, celým číslam a reálnym číslam.

Keďže typ rôznych falošných konštánt je odlišný, na ich rozlíšenie môžete použiť dvojicu operátorov === a! ==.
Operátor === vráti hodnotu false pre všetky dvojice nesprávnych hodnôt.
Vráti hodnotu true iba pre argumenty, z ktorých jeden má priradenú hodnotu NULL a druhý nemá priradenú žiadnu hodnotu.

Rozdiel medzi nulovými premennými a nedefinovanými premennými

Operátor === vám umožňuje rozlíšiť všetky falošné hodnoty, okrem premenných s hodnotou NULL, od premenných, ktorým nebola priradená hodnota.

Takéto premenné možno rozlíšiť pomocou funkcie get_defined_vars ().

Ak potrebujete zistiť, či bola premennej $ var priradená hodnota, môžete na to použiť nasledujúci útržok kódu:
if (array_key_exists ("var", get_defined_vars ())) (echo "var je definovaná"; // $ var je priradené NULL) else (echo "var nie je definovaná"; // $ var nie je definovaný alebo nie je nastavený ($ var) bol nazývaný)

závery

Vždy by ste mali pamätať na to, že v PHP sa dve falošné hodnoty nemusia navzájom rovnať a premenné, ktoré sú na prvý pohľad odlišné, sa môžu pri porovnaní ukázať ako rovnaké. Aby ste sa vyhli takýmto prekvapeniam, môžete použiť operátory === a! ==.

Pri práci s poľami, aby ste sa vyhli prekvapeniam, môžete napísať funkciu na prevod hodnôt na zaručene odlišné indexy. Potom je možné pristupovať k prvkom poľa iba s jeho pomocou. To môže spomaliť program, ale môže to pomôcť vyhnúť sa prekvapeniam.

Moderné programovanie dlho a úspešne manipulovalo s premennými bez typu. Typ premennej môže byť vopred vynechaný a môže byť zmenený počas vykonávania programu.

Tento koncept sa stal ústredným prvkom všeobecnej programovacej paradigmy. Na samom začiatku programovacej éry jazyky s rovnakou fundamentálnou istotou vyžadovali od programátora, aby vopred deklaroval premenné a prísne zabezpečil, aby im nebolo priradené nič nevhodné. To, že premenná mení svoj typ, ani programy, ani programovacie jazyky predtým netušili.

O prázdnom a neexistujúcom

Funkcia PHP empty () je opakom funkcie isset () a má určité špecifické využitie. Ak neexistuje žiadna premenná, potom prvá funkcia na ňu reaguje pozitívne a jej výsledok je pravdivý a druhá - záporná, to znamená, že jej hodnota bude nepravdivá.

Podľa definície je isset () určený na kontrolu existencie premennej. Nezáleží na tom, čo a ako bolo priradené k premennej, hlavné je, že to tam je a nie je zničené funkciou unset (). Výsledok funkcie isset () bude kladný - pravdivý. Je dôležité si zapamätať, že ak $ iVar = 0; potom isset ($ iVar) bude pravdivé, ale prázdne ($ iVar) bude tiež pravdivé.

V prvom prípade výsledok znamená, že premenná existuje, v druhom prípade - premenná je prázdna, to znamená hodnota "0" v ľubovoľnom tvare, či už ide o reťazec ("0") alebo číslo (zlomok - 0,0 alebo celé číslo - 0) je rovnaké: prázdne ($ iVar) bude pravda.

O bezpečnosti a kontrole

Prax ukazuje, že netypizované jazyky dávajú programátorovi oveľa väčšiu slobodu, ale predpokladá sa, že jeho postoj k práci na algoritme je zodpovednejší.

PHP ponúka modernú syntax, ktorá zachováva dobre zavedenú sémantiku, má málo chýb, ale vyžaduje si starostlivú pozornosť. Napríklad každé volanie funkcie vyžaduje množstvo parametrov.

Pri volaní funkcie nie je vôbec potrebné odovzdať všetky parametre, môžete odovzdať len podstatnú časť z nich. Funkcia je „povinná“ kontrolovať existenciu a existenciu všetkých parametrov. Tie z nich, ktoré chýbajú alebo majú nesprávne hodnoty, sa musia uviesť do normálnej podoby a priradiť im požadované hodnoty.

V tomto kontexte je podstatná funkcia PHP prázdny (). Výraz:

$ a = "1; 2" + 20

nastaví premennú $ a na 21, pretože prvá časť výrazu bude reprezentovaná ako 1 a druhá bude 20.

Výsledok bude typu číslo a funkcia PHP empty ($ a) vráti false, to znamená, že premenná $ a nie je prázdna.

V tejto súvislosti má funkciu:

funcTest ($ a = 0, $ b = 20)

Pri volaní:

$ res = funcTest ($ aVal, $ bVal)

bude mať čo chce, teda výsledok funkcie. A keď zavoláš:

  • $ res = funcTest ($ aVal. $ bVal)

telo funkcie obsahuje iba jeden parameter s hodnotou "$ aVal. $ bVal" a s najväčšou pravdepodobnosťou bude tento parameter interpretovaný ako reťazec znakov.

PHP prázdne () pre objekty a polia

Syntax jazyka má dostatočný počet konštrukcií a funkcií na prácu s objektmi a poľami, no z hľadiska ich kontroly na existenciu a na prítomnosť hodnoty neexistujú žiadne špeciálne rozdiely od premenných.

PHP empty (pole) - Ekvivalent volania empty (jednoduchá premenná). Existujú však veľmi dôležité úvahy týkajúce sa objektov. Pokiaľ ide o kontrolu existencie objektu (isset), otázka sotva dáva zmysel. Čo sa týka funkcie PHP empty (), jej užitočnosť je otázna.

Podľa logiky objektovo orientovaného programovania má objekt svoj vlastný obsah a vlastný súbor metód. Iba samotný objekt môže povedať, či je prázdny alebo nie, ale nie funkcia tretej strany, aj keď je zahrnutá v syntaxi jazyka.

Objekt a jeho prázdna () funkcia

Na tomto jednoduchom, no právnom základe by sa mal každý predmet posudzovať v kontexte jeho chápania „prázdnoty“. Napríklad implementácia objektu Staffing pozostáva zo záznamov zamestnancov. Ale ak tam nie je ani jeden zamestnanec, tak v "tabuľke zamestnancov" sú vždy možnosti pre pozície potenciálnych zamestnancov.

Na akej úrovni tu aplikujete funkciu prázdneho objektu PHP? Na úrovni „Staffing“ všetko existuje, aj keď tam nie sú žiadni zamestnanci. Na úrovni „Zamestnanec“ už objekt existuje, aj keď nie je úplne vyplnený. A neúplne vyplnený objekt možno pripísať prázdnemu objektu. Personálnemu stolu neprináša žiadne výhody.

V závislosti od zvoleného štýlu programovania sú funkcie PHP empty () a isset () veľmi dôležité pre vytvorenie bezpečného a spoľahlivého algoritmu, ale pre objekty je stále lepšie mať vlastnú verziu prázdneho (), ktorá je určená jej obsahom.

V PHP sa hodnoty FALSE a NULL a ich pridružené hodnoty líšia od toho, ako sú zvyčajne v iných jazykoch a majú svoje vlastné nezrejmé zvláštnosti.
Článok pojednáva o týchto funkciách.
Pre začiatočníkov môže byť užitočné vidieť úplný obraz, pre skúsených čitateľov - aktualizovať v pamäti, ak z mojej hlavy vyletela nejaká nuansa.

FALSE vo výkazoch If

Podľa dokumentácie PHP sú nasledujúce hodnoty po pretypovaní na booleovský typ FALSE:
  • samotná boolovská hodnota je FALSE
  • prázdny reťazec ("") a reťazec "0".
  • prázdne pole - pole ().
  • objekt s nulovými členskými premennými (iba v PHP 4, ktoré nie je zahrnuté v tomto článku)
  • špeciálne null (vrátane nenastavených premenných)
  • Objekty SimpleXML (nie sú zahrnuté v tomto článku)
To znamená, že ak sa takéto hodnoty prenesú do podmienky:
ak (...) ozvena „1“; inak echo „0“;
potom sa zobrazí reťazec "0".

Ak hodnota premennej nie je nastavená (nenastavená), môže byť tiež vydané varovanie. Pripomeňme, že varovanie v podmienke možno odstrániť napísaním @ pred premennú.

Napríklad:

Ak (@ $ undefVar) (...)
Ale by ste mali používať @ iba v extrémnych prípadoch, keď ste to dobre premysleli a neexistujú žiadne iné vhodné možnosti. Pozrite si funkciu isset ().

Funkcia is_null () a jazykové konštrukcie isset () a empty ().

is_null () vráti hodnotu TRUE iba pre premenné, ktorým nebola priradená žiadna hodnota alebo im bola priradená hodnota NULL.
isset () vráti jednu ku jednej opačné boolovské hodnoty v porovnaní s is_null ().
Ak premennej nie je priradená hodnota, potom is_null () tiež generuje varovanie "Nedefinovaná premenná", na rozdiel od isset (), ktoré negeneruje žiadne varovania.
Pripomeňme, že na odstránenie hodnoty premennej môžete použiť funkciu unset (). Na tento účel môžete tiež priradiť hodnotu NULL, aby ste sa vyhli varovaniam kompilátora pri pokuse o načítanie hodnoty premennej.

Upozorňujeme, že na rozdiel od premenných na prácu s konštantami musíte použiť definovanú konštrukciu ().

Reprezentácia reťazca

Pozrime sa na reťazcovú reprezentáciu falošných konštánt.
Napríklad zreťazenie konvertuje hodnoty na nasledujúce reťazce uvedené v tabuľke nižšie:

Podrobnejšie je téma prevodu na reťazce popísaná na oficiálnej stránke v časti Konverzia na reťazce.

Porovnávacie operátory

Prejdime k porovnávacím operátorom.
Všetky nepravdivé hodnoty, ako sa očakávalo, vrátia hodnotu true pri porovnaní s FALSE pomocou operátora "==".
Pri vzájomnom porovnávaní falošných reťazcov by ste sa však nemali spoliehať na prechodnosť.
Tu je úplná tabuľka na porovnanie falošných hodnôt (plus označuje prvky tabuľky, ktoré pri porovnaní pomocou operátora "! =" vrátia skutočnú hodnotu:

$ undef - premenná, ktorá nemá priradenú hodnotu

Z tabuľky možno vyvodiť niekoľko pekných záverov:
1. Ak vieme, že používame iba reťazce, tak ich môžeme ľahko porovnať a nemusíme sa báť, že "" (prázdny reťazec) sa bude rovnať "0".
2. Polia sa nikdy nerovnajú reťazcom, celým číslam a reálnym číslam.

Keďže typ rôznych falošných konštánt je odlišný, na ich rozlíšenie môžete použiť dvojicu operátorov === a! ==.
Operátor === vráti hodnotu false pre všetky dvojice nesprávnych hodnôt.
Vráti hodnotu true iba pre argumenty, z ktorých jeden má priradenú hodnotu NULL a druhý nemá priradenú žiadnu hodnotu.

Rozdiel medzi nulovými premennými a nedefinovanými premennými

Operátor === vám umožňuje rozlíšiť všetky falošné hodnoty, okrem premenných s hodnotou NULL, od premenných, ktorým nebola priradená hodnota.

Takéto premenné možno rozlíšiť pomocou funkcie get_defined_vars ().

Ak potrebujete zistiť, či bola premennej $ var priradená hodnota, môžete na to použiť nasledujúci útržok kódu:
if (array_key_exists ("var", get_defined_vars ())) (echo "var je definovaná"; // $ var je priradené NULL) else (echo "var nie je definovaná"; // $ var nie je definovaný alebo nie je nastavený ($ var) bol nazývaný)

závery

Vždy by ste mali pamätať na to, že v PHP sa dve falošné hodnoty nemusia navzájom rovnať a premenné, ktoré sú na prvý pohľad odlišné, sa môžu pri porovnaní ukázať ako rovnaké. Aby ste sa vyhli takýmto prekvapeniam, môžete použiť operátory === a! ==.

Pri práci s poľami, aby ste sa vyhli prekvapeniam, môžete napísať funkciu na prevod hodnôt na zaručene odlišné indexy. Potom je možné pristupovať k prvkom poľa iba s jeho pomocou. To môže spomaliť program, ale môže to pomôcť vyhnúť sa prekvapeniam.

Testovanie bolo vykonané s PHP 5.3.1.

Ďalšie odkazy

1. Porovnávacie tabuľky typov PHP.
2. MySQl Null a Empty Strings v kontexte PHP.

Štítky: Pridať štítky

variabilný reťazec (12)

Mám funkciu isNotEmpty, ktorá vracia true, ak reťazec nie je prázdny, a false, ak je reťazec prázdny. Zistil som, že to nefunguje, ak cez to prejdem prázdny riadok.

Funkcia isNotEmpty (vstup $) ($ strTemp = $ vstup; $ strTemp = orez ($ strTemp); if (strTemp! = "") // Vyskúšali ste aj toto "if (strlen ($ strTemp)> 0)" (návrat true ;) vrátiť false ;)

Reťazec sa kontroluje pomocou isNotEmpty:

If (isNotEmpty ($ userinput ["phoneNumber")])) (// overte telefónne číslo) else (echo "Telefónne číslo nie je zadané"
"; }

Ak je riadok prázdny, ostatné sa nevykoná, nerozumiem prečo, môže to niekto prosím osvetliť.

Odpovede

ak máte pole s názvom sériové_číslo a chcete skontrolovať prázdne miesto

$ sériové_číslo = orezanie ($ _ POST); $ q = "vyberte * z produktu, kde user_id =" $ _ SESSION ""; $ rs = mysql_query ($ q); while ($ row = mysql_fetch_assoc ($ rs)) (if (prázdne ($ _ POST ["žehličky"))) ($ žehličky = $ riadok ["product1"];)

týmto spôsobom môžete iterovať cez všetky slučky v slučke s ďalšou prázdnou funkciou

No namiesto odpovede (verím, že si svoj problém už vyriešil) ti poradím.

Neviem ako všetci ostatní, ale mňa osobne veľmi rozčuľuje pohľad na niečo ako:

Ak (<>) (návrat true;) return false;

to si vyžaduje elegantný „návrat (<>); ". Vždy sa pozrite na svoj kód a odstráňte túto logiku. Pre každý situácii, nepotrebujete výpis IF.

Práve píšem svoju vlastnú funkciu is_string na kontrolu typu a strlen na kontrolu dĺžky.

Funkcia emptyStr ($ str) (return is_string ($ str) && strlen ($ str) === 0;) print emptyStr ("")? "empty": "nie je prázdny"; // prázdne

EDIT: Môžete tiež použiť funkciu trim na kontrolu, či reťazec neobsahuje.

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

PHP má vstavanú funkciu s názvom empty () Test sa vykoná napísaním if (empty ($ string)) (...) php.net link: php empty

Máte odpoveď, ale vo vašom prípade môžete použiť

Návrat prázdny (vstup $);

Návrat je_reťazec (vstup $);

Jednoduchý problém. Zmeniť:

If (strTemp! = "")

If ($ strTemp! = "")

Možno to môžete zmeniť aj na:

If ($ strTemp! == "")

since! = "" vráti true, ak zadáte číselné číslo 0 a niekoľko ďalších prípadov kvôli automatickej konverzii typov PHP.

Majte tiež na pamäti, že PHP už má prázdnu funkciu ().

PHP vyhodnotí prázdny reťazec ako false, takže môžete jednoducho použiť:

If (orezať ($ userinput ["phoneNumber")]) (// overiť telefónne číslo) else (echo "Telefónne číslo nie je zadané"
"; }

Vždy používam regulárny výraz na kontrolu prázdneho reťazca, s odkazom na dni CGI / Perl, ako aj Javascript, tak prečo nie ako PHP (aj keď netestované)

Return preg_match ("/ \ S /", $ vstup);

Kde \ S predstavuje ľubovoľný znak bez medzier

Stačí použiť funkciu strlen ().

If (strlen ($ s)) (// nie je prázdne)

Nedávno som si položil rovnakú otázku.
Existuje niekoľko možných riešení, tu sú 3 platné:

  • s.indexOf (štartovací) === 0
  • s.substr (0, starter.length) === starter
  • s.lastIndexOf (začiatok, 0) === 0 (pridané po prezretí odpovede Marka Bayera)
  • pomocou slučky:

    Funkcia beginWith (s, štartér) (pre (var i = 0, cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Nestretol som sa s najnovším riešením, ktoré používa slučku.
Prekvapivo je toto riešenie výrazne lepšie ako prvé 3.
Tu je test jsperf, ktorý som spustil, aby som dospel k tomuto záveru: http://jsperf.com/startswith2/2

ps: ecmascript 6 (harmónia) zavádza vlastnú metódu spustenia pre reťazce.
Zamyslite sa nad tým, koľko času by sa ušetrilo, keby uvažovali o zahrnutí tejto veľmi potrebnej metódy do prvej verzie.

Obnoviť

Všimnite si, že existujú 2 optimalizácie slučky, ktoré Steve zahrnul, prvá z nich vykazovala najlepší výkon, takže tento kód zverejním nižšie:

Funkcia beginWith2 (str, prefix) (if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str [i] === predpona [i]); --Pokračujem; vrátiť i< 0; }