Php, pokud je proměnná prázdná. Cheat sheet pro PHP: FALSE, NULL a hodnoty s nimi spojené. FALSE v příkazech If

variabilní řetězec (12)

Mám funkci isNotEmpty, která vrací true, pokud řetězec není prázdný, a false, pokud je řetězec prázdný. Zjistil jsem, že to nefunguje, když přes něj projedu prázdný řádek.

Funkce isNotEmpty($input) ( $strTemp = $vstup; $strTemp = trim($strTemp); if(strTemp != "") //Zkusili také toto "if(strlen($strTemp) > 0)" ( návrat true ;) vrátí false ;)

Řetězec se kontroluje pomocí isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) ( //ověřte telefonní číslo ) else ( echo "Telefonní číslo není zadáno
"; }

Pokud je řádek prázdný, jinak se neprovede, nechápu proč, může to prosím někdo osvětlit.

Odpovědi

pokud máte pole jmenovitě sériové_číslo a chcete zkontrolovat prázdné místo

$sériové_číslo = trim($_POST); $q="vyberte * z produktu, kde user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))( if(empty($_POST["irons"]))( $irons=$row["product1"]; )

tímto způsobem můžete iterovat všechny smyčky ve smyčce s další prázdnou funkcí

No, místo odpovědi (věřím, že jste svůj problém již vyřešil), vám dám radu.

Nevím jak všichni ostatní, ale mě osobně velmi vadí, když vidím něco jako:

Li(<>) ( return true; ) return false;

to vyžaduje elegantní "návrat" (<>); " Vždy se prosím podívejte na svůj kód a odstraňte tuto logiku. Pro každý V situaci nepotřebujete příkaz IF.

Právě píšu svou vlastní funkci is_string pro kontrolu typů a strlen pro kontrolu délky.

Funkce emptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print emptyStr("") ? "prázdný" : "není prázdný"; // prázdný

EDIT: Můžete také použít funkci trim pro kontrolu, zda řetězec neobsahuje.

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

PHP má vestavěnou funkci nazvanou empty() Test se provádí zadáním if(empty($string))(...) php.net link: php empty

Máte odpověď, ale ve vašem případě můžete použít

Return empty($input);

Return is_string($input);

Jednoduchý problém. Změna:

If(strTemp != "")

If($strTemp != "")

Možná to můžete také změnit na:

If($strTemp !== "")

protože != "" vrátí true, pokud předáte číselné číslo 0 a několik dalších případů kvůli automatické konverzi typů PHP.

Také mějte na paměti, že PHP již má funkci empty().

PHP vyhodnotí prázdný řetězec jako false, takže můžete jednoduše použít:

If (trim($userinput["phoneNumber"])) ( // ověření telefonního čísla ) else ( echo "Telefonní číslo není zadáno
"; }

Ke kontrole prázdného řetězce vždy používám regex, který pochází z dob CGI/Perlu i Javascriptu, tak proč ne například PHP (i když netestováno)

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

Kde \S představuje libovolný znak bez mezer

Stačí použít funkci strlen().

If (strlen($s)) ( // není prázdné )

Nedávno jsem si položil stejnou otázku.
Existuje několik možných řešení, zde jsou 3 platná:

  • s.indexOf(startér) === 0
  • s.substr(0,starter.length) === startér
  • s.lastIndexOf(startér, 0) === 0 (přidáno po zhlédnutí odpovědi Marka Bayera)
  • pomocí smyčky:

    Funkce beginWith(s,starter) ( for (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Nesetkal jsem se s posledním řešením, které zahrnuje použití smyčky.
Překvapivě je toto řešení výrazně lepší než první 3.
Zde je test jsperf, který jsem provedl, abych dospěl k tomuto závěru: http://jsperf.com/startswith2/2

ps: ecmascript 6 (harmony) zavádí vlastní metodu beginWith pro řetězce.
Přemýšlejte o tom, kolik času by bylo ušetřeno, kdyby je napadlo zahrnout tuto tolik potřebnou metodu do první verze.

Aktualizace

Všimněte si, že existují 2 optimalizace smyček, které Steve zahrnul, první z nich vykazoval lepší výkon, takže tento kód zveřejním níže:

Funkce beginWith2(str, prefix) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === předpona[i]); --pokračuji; vrátit i< 0; }

Moderní programování již dlouhou dobu úspěšně manipuluje s netypovanými proměnnými. Typ proměnné nelze určit předem a lze jej změnit během provádění programu.

Tento koncept se stal ústředním prvkem obecného programovacího paradigmatu. Na samém počátku programovací éry jazyky se stejnou důkladnou jistotou vyžadovaly, aby programátor předem definoval proměnné a přísně zajistil, aby jim nebylo přiřazeno nic nezákonného. Ani programy, ani programovací jazyky předtím neměly tušení, že proměnná mění svůj typ.

O prázdném a neexistujícím

Funkce PHP empty() je inverzní funkce isset() a má některé speciální funkce použití. Pokud neexistuje žádná proměnná, pak první funkce odpoví kladně a její výsledek je pravdivý a druhá odpoví záporně, to znamená, že její hodnota bude nepravdivá.

Podle definice je isset() navržena ke kontrole existence proměnné. Nezáleží na tom, co a jak bylo proměnné přiřazeno, hlavní je, že existuje a není zničena funkcí unset(). Výsledek funkce isset() bude kladný - true. Je důležité si uvědomit, že pokud $iVar = 0; pak isset($iVar) bude mít hodnotu true, ale empty($iVar) bude také pravda.

V prvním případě výsledek znamená, že proměnná existuje, ve druhém případě je proměnná prázdná, tedy hodnota „0“ v libovolném tvaru, ať už je to řetězec („0“) nebo číslo (zlomek - 0.0 nebo celé číslo - 0) je stejné: empty($iVar) bude mít hodnotu true.

O zabezpečení a kontrole

Praxe ukazuje, že netypizované jazyky dávají programátorovi mnohem více svobody, ale předpokládejme, že jeho přístup k práci na algoritmu je zodpovědnější.

PHP nabízí moderní syntaxi, která podporuje zavedenou sémantiku, má málo chyb, ale vyžaduje pečlivou pozornost. Například volání jakékoli funkce vyžaduje určitý počet parametrů.

Při volání funkce není vůbec nutné předávat všechny parametry, můžete předat pouze významnou část z nich. Funkce "musí" kontrolovat přítomnost a existenci všech parametrů. Ty, které chybí nebo mají nesprávné hodnoty, musí být obnoveny do normálního tvaru a přiřazeny požadované hodnoty.

V této souvislosti je nezbytná funkce PHP empty(). Výraz:

$a = "1;2" + 20

přiřadí proměnné $a hodnotu 21, protože první část výrazu bude reprezentována jako 1 a druhá bude 20.

Výsledek bude typu číslo a PHP funkce empty($a) bude mít výsledek - false, tedy proměnná $a není prázdná.

V této souvislosti má funkci:

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

Při volání:

$res = funcTest($aVal, $bVal)

bude mít to, co je žádoucí, tedy výsledek funkce. A když se volá:

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

Tělo funkce obsahuje pouze jeden parametr s hodnotou "$aVal . $bVal" a tento parametr bude pravděpodobně interpretován jako řetězec znaků.

PHP empty() pro objekty a pole

Syntaxe jazyka má dostatečné množství konstrukcí a funkcí pro práci s objekty a poli, ale z hlediska kontroly jejich existence a přítomnosti hodnoty zde nejsou žádné zvláštní rozdíly od proměnných.

PHP prázdné (pole) - ekvivalentní volání prázdné (jednoduchá proměnná). Existují však velmi významné úvahy týkající se objektů. Pokud jde o kontrolu existence objektu (isset), otázka sotva dává smysl. Co se týče funkce PHP empty(), zůstává vhodnost jejího použití sporná.

Podle logiky objektově orientovaného programování má objekt svůj vlastní obsah a vlastní sadu metod. Pouze samotný objekt může zjistit, zda je prázdný nebo není prázdný, ale ne funkce třetí strany, i když je součástí syntaxe jazyka.

Objekt a jeho funkce empty()

Na tomto jednoduchém, ale legitimním základě by měl být každý předmět posuzován v kontextu jeho chápání „prázdnoty“. Například implementace objektu "Tabulka zaměstnanců" se skládá ze záznamů "Zaměstnanec". Pokud však není jediný zaměstnanec, pak v „Seznamu zaměstnanců“ jsou vždy možnosti pro pozice potenciálních zaměstnanců.

Na jaké úrovni bych zde měl používat funkci prázdného objektu PHP? Na úrovni "Staffing" vše existuje, i když tam není jediný zaměstnanec. Na úrovni "Zaměstnanec" objekt již existuje, i když není zcela vyplněn. Ne zcela vyplněný objekt lze klasifikovat jako prázdný objekt. Pro personální stůl z toho není žádný užitek.

V závislosti na vašem stylu programování jsou funkce PHP empty() a isset() velmi důležité pro vytvoření bezpečného a spolehlivého algoritmu, ale pro objekty je stále lepší mít variantu empty() definovanou svým obsahem.

V PHP se hodnoty FALSE a NULL a jejich přidružené hodnoty liší od toho, jak jsou obvykle v jiných jazycích, a mají své vlastní nezřejmé vlastnosti.
Článek pojednává o těchto funkcích.
Pro začátečníky to může být užitečné pro zobrazení celého obrazu, pro zkušené čtenáře může být užitečné osvěžit si paměť, pokud jim nějaká nuance vypadla z hlavy.

FALSE v příkazech If

Podle dokumentace PHP jsou následující hodnoty po přetypování na logickou hodnotu FALSE:
  • samotná booleovská hodnota je FALSE
  • prázdný řetězec ("") a řetězec "0".
  • prázdné pole (array) – array().
  • objekt s nulovými proměnnými členů (pouze PHP 4, nepopsané v tomto článku)
  • speciální hodnota NULL (včetně nenastavených proměnných)
  • Objekty SimpleXML (nezahrnuté v tomto článku)
To znamená, že pokud jsou takové hodnoty předány podmínce:
pokud (…) echo „1“; jinak echo „0“;
pak se vytiskne řetězec "0".

Pokud hodnota proměnné není nastavena (nenastavena), může být také vydáno varování. Připomeňme, že varování v podmínce lze odstranit napsáním @ před proměnnou.

Například:

Pokud (@$undefVar) ( …)
@ Ale měli byste používat pouze v extrémních případech, kdy jste si to pečlivě promysleli a neexistují žádné jiné vhodné možnosti. Viz funkce isset().

Funkce is_null() a jazykové konstrukce isset() a empty()

is_null() vrací TRUE pouze pro proměnné, které nemají přiřazenu žádnou hodnotu nebo mají přiřazenou hodnotu NULL .
isset() vrací booleovské hodnoty jedna ku jedné ve srovnání s is_null() .
Pokud proměnná není přiřazena hodnota, pak is_null() také vydá varování "Nedefinovaná proměnná", na rozdíl od isset(), která nevydává žádné varování.
Připomeňme, že k odstranění hodnoty proměnné můžete použít funkci unset(). Pro tento účel můžete také přiřadit hodnotu NULL, abyste předešli varování kompilátoru při pokusu o čtení hodnoty proměnné.

Vezměte prosím na vědomí, že na rozdíl od proměnných musíte pro práci s konstantami použít konstrukci define().

Reprezentace řetězce

Podívejme se na řetězcovou reprezentaci falešných konstant.
Například zřetězení převede hodnoty do následujících řetězců, které jsou uvedeny v tabulce níže:

Téma převodu na řetězce je podrobněji popsáno na oficiálních stránkách v odstavci Převod na řetězec.

Porovnávací operátory

Přejděme ke srovnávacím operátorům.
Všechny nepravdivé hodnoty vrátí hodnotu true, jak se očekávalo, při porovnání s FALSE pomocí operátoru " == ".
Při vzájemném porovnávání falešných řetězcových konstant byste se zde ale neměli spoléhat na tranzitivitu.
Zde je kompletní tabulka pro porovnání nepravdivých hodnot (plus označuje prvky tabulky, které při porovnání pomocí operátoru „ != “ vrátí skutečnou hodnotu:

$undef – proměnná, která nemá přiřazenu hodnotu

Z tabulky lze vyvodit několik příjemných závěrů:
1. Pokud víme, že používáme pouze řetězce, pak je můžeme bezpečně porovnávat a nebát se, že "" (prázdný řetězec) se bude rovnat "0".
2. Pole se nikdy nerovnají řetězcům, celým číslům nebo reálným číslům.

Protože typy různých falešných konstant jsou různé, lze k jejich rozlišení použít dvojici operátorů === a !==.
Operátor === vrací hodnotu false pro všechny dvojice hodnot false.
Vrátí pravdivou hodnotu pouze pro argumenty, z nichž jednomu je přiřazena hodnota NULL a druhému není přiřazena žádná hodnota.

Rozdíl mezi proměnnými s hodnotou NULL a nedefinovanými proměnnými

Operátor === umožňuje rozlišovat mezi všemi falešnými hodnotami, kromě proměnných s hodnotou NULL od proměnných, kterým nebyla přiřazena žádná hodnota.

Takové proměnné lze rozlišit pomocí funkce get_defined_vars().

Pokud potřebujete zjistit, zda byla k proměnné $var přiřazena hodnota, lze k tomu použít následující fragment kódu:
if (array_key_exists("var", get_defined_vars())) ( echo "var je definována"; // $var je přiřazeno NULL) else ( echo "var NENÍ definováno"; // $var není definováno nebo není nastaveno ($ var) byl nazýván)

závěry

Vždy byste si měli pamatovat, že v PHP se dvě falešné hodnoty nemusejí navzájem rovnat a proměnné, které se na první pohled zdají být odlišné, se mohou při srovnání ukázat jako stejné. Abyste se takovým překvapením vyhnuli, můžete použít operátory === a !==.

Při práci s poli, abyste se vyhnuli překvapením, můžete napsat funkci pro převod hodnot na zaručeně různé indexy. Poté lze k prvkům pole přistupovat pouze pomocí něj. To může zpomalit program, ale pomůže to předejít překvapením.

Testování bylo provedeno na PHP 5.3.1.

Další odkazy

1. Porovnávací tabulky typů PHP.
2. MySQl Null a Empty Strings v kontextu PHP.

Štítky: Přidat štítky

V PHP se hodnoty FALSE a NULL a jejich přidružené hodnoty liší od toho, jak jsou obvykle v jiných jazycích, a mají své vlastní nezřejmé vlastnosti.
Článek pojednává o těchto funkcích.
Pro začátečníky to může být užitečné pro zobrazení celého obrazu, pro zkušené čtenáře může být užitečné osvěžit si paměť, pokud jim nějaká nuance vypadla z hlavy.

FALSE v příkazech If

Podle dokumentace PHP jsou následující hodnoty po přetypování na logickou hodnotu FALSE:
  • samotná booleovská hodnota je FALSE
  • prázdný řetězec ("") a řetězec "0".
  • prázdné pole (array) – array().
  • objekt s nulovými proměnnými členů (pouze PHP 4, nepopsané v tomto článku)
  • speciální hodnota NULL (včetně nenastavených proměnných)
  • Objekty SimpleXML (nezahrnuté v tomto článku)
To znamená, že pokud jsou takové hodnoty předány podmínce:
pokud (…) echo „1“; jinak echo „0“;
pak se vytiskne řetězec "0".

Pokud hodnota proměnné není nastavena (nenastavena), může být také vydáno varování. Připomeňme, že varování v podmínce lze odstranit napsáním @ před proměnnou.

Například:

Pokud (@$undefVar) ( …)
@ Ale měli byste používat pouze v extrémních případech, kdy jste si to pečlivě promysleli a neexistují žádné jiné vhodné možnosti. Viz funkce isset().

Funkce is_null() a jazykové konstrukce isset() a empty()

is_null() vrací TRUE pouze pro proměnné, které nemají přiřazenu žádnou hodnotu nebo mají přiřazenou hodnotu NULL .
isset() vrací booleovské hodnoty jedna ku jedné ve srovnání s is_null() .
Pokud proměnná není přiřazena hodnota, pak is_null() také vydá varování "Nedefinovaná proměnná", na rozdíl od isset(), která nevydává žádné varování.
Připomeňme, že k odstranění hodnoty proměnné můžete použít funkci unset(). Pro tento účel můžete také přiřadit hodnotu NULL, abyste předešli varování kompilátoru při pokusu o čtení hodnoty proměnné.

Vezměte prosím na vědomí, že na rozdíl od proměnných musíte pro práci s konstantami použít konstrukci define().

Reprezentace řetězce

Podívejme se na řetězcovou reprezentaci falešných konstant.
Například zřetězení převede hodnoty do následujících řetězců, které jsou uvedeny v tabulce níže:

Téma převodu na řetězce je podrobněji popsáno na oficiálních stránkách v odstavci Převod na řetězec.

Porovnávací operátory

Přejděme ke srovnávacím operátorům.
Všechny nepravdivé hodnoty vrátí hodnotu true, jak se očekávalo, při porovnání s FALSE pomocí operátoru " == ".
Při vzájemném porovnávání falešných řetězcových konstant byste se zde ale neměli spoléhat na tranzitivitu.
Zde je kompletní tabulka pro porovnání nepravdivých hodnot (plus označuje prvky tabulky, které při porovnání pomocí operátoru „ != “ vrátí skutečnou hodnotu:

$undef – proměnná, která nemá přiřazenu hodnotu

Z tabulky lze vyvodit několik příjemných závěrů:
1. Pokud víme, že používáme pouze řetězce, pak je můžeme bezpečně porovnávat a nebát se, že "" (prázdný řetězec) se bude rovnat "0".
2. Pole se nikdy nerovnají řetězcům, celým číslům nebo reálným číslům.

Protože typy různých falešných konstant jsou různé, lze k jejich rozlišení použít dvojici operátorů === a !==.
Operátor === vrací hodnotu false pro všechny dvojice hodnot false.
Vrátí pravdivou hodnotu pouze pro argumenty, z nichž jednomu je přiřazena hodnota NULL a druhému není přiřazena žádná hodnota.

Rozdíl mezi proměnnými s hodnotou NULL a nedefinovanými proměnnými

Operátor === umožňuje rozlišovat mezi všemi falešnými hodnotami, kromě proměnných s hodnotou NULL od proměnných, kterým nebyla přiřazena žádná hodnota.

Takové proměnné lze rozlišit pomocí funkce get_defined_vars().

Pokud potřebujete zjistit, zda byla k proměnné $var přiřazena hodnota, lze k tomu použít následující fragment kódu:
if (array_key_exists("var", get_defined_vars())) ( echo "var je definována"; // $var je přiřazeno NULL) else ( echo "var NENÍ definováno"; // $var není definováno nebo není nastaveno ($ var) byl nazýván)

závěry

Vždy byste si měli pamatovat, že v PHP se dvě falešné hodnoty nemusejí navzájem rovnat a proměnné, které se na první pohled zdají být odlišné, se mohou při srovnání ukázat jako stejné. Abyste se takovým překvapením vyhnuli, můžete použít operátory === a !==.

Při práci s poli, abyste se vyhnuli překvapením, můžete napsat funkci pro převod hodnot na zaručeně různé indexy. Poté lze k prvkům pole přistupovat pouze pomocí něj. To může zpomalit program, ale pomůže to předejít překvapením.

Pokud při práci s řetězci potřebujete zkontrolovat, zda je řetězec prázdný, obvykle tuto funkci používají začínající programátoři strlen(). Tato funkce je poměrně rychlá, protože neprovádí žádné výpočty, ale jednoduše vrací již známou hodnotu délky řetězce, dostupnou ve zval (PHP používá k ukládání proměnných strukturu C). Ale přesto, protože strlen()- toto je funkce, je trochu pomalá, protože při volání vyžaduje několik akcí, jako je převod na malá písmena a prohledávání hashovací tabulky. V některých případech můžete zvýšit rychlost provádění kódu pomocí prázdný()..., ale také prázdný() Ještě to můžete trochu optimalizovat.

Vezměme si příklad Například kontrola cesty obrázku, funkce zkontroluje, zda je cesta prázdná, a poté ji nahradí jinou cestou, například „images/noimage.jpg“.

A tak se celý úkol scvrkává na kontrolu, zda je proměnná typu string prázdná. Zkusme 4 způsoby:

  • if(strlen($img_path)>0)
  • if($img_path(0))
  • if(empty($img_path))
  • a ještě jeden způsob na závěr.

A tak budeme psát prvním způsobem:

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

Pojďme provést testování, průměrná doba testu trvala 1.43795800209 sek.

Přemýšlejte o tom trochu více... Můžete přistupovat k prvnímu znaku řádku najednou, spíše než k celému řádku. Pokud je tam první znak, pak řetězec není prázdný. První znak v řádku je očíslován "0".

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

průměrná doba trvání testu 1.19431300163 sek., 17 % odehraného času

Zkusme nyní psát pomocí empty():

Funkce check_image_path($img_path) ( if (prázdné ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

průměrná doba trvání testu 1.1341319084 sec., 5 % času přehrávaného z předchozího příkladu

Nyní se podívejme na předposlední a poslední příklad nad námi. Pojďme se podívat, jak se to dá zkombinovat. přemýšlejte... jak jinak můžete optimalizovat?

Funkce check_image_path($img_path) ( if (prázdné ($img_path ( 0) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

průměrná doba trvání testu 1.07465314865 a opět jsme vyhráli 5% času...

Jak to funguje a proč je to rychlejší? A tady $img_path(0) vrátí první znak... a poté funkci prázdný() zkontroluje prázdný řetězec... rozdíl oproti předchozímu příkladu je v tom, že funkci je předán pouze jeden znak, nikoli celý řetězec. Takže od prvního příkladu do posledního jsme vyhráli 25% čas.