Procvičte si práci s funkcí PHP empty(). Praxe používání funkce PHP empty() Co je prázdné v adresním řádku

Pokud při práci s řetězci potřebujete zkontrolovat, zda je řetězec prázdný, začínající programátoři funkci obvykle používají 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() je funkce, je trochu pomalá, protože její volání vyžaduje několik kroků, jako jsou malá písmena a vyhledávání v hašovací tabulce. V některých případech můžete kód urychlit pomocí prázdný()..., ale také prázdný() lze ještě trochu optimalizovat.

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

A tak celý úkol spočívá v kontrole, 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, jak to ukončit.

A tak píšeme 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 testovat, průměrná doba testu trvala 1.43795800209 sek.

Trochu více přemýšlet... Můžete přistupovat k prvnímu znaku řetězce najednou, nikoli k celému řetězci. Pokud je uveden první znak, pak řetězec není prázdný. První znak v řetězci je číslován od "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 sec., 17 % odehraného času

Zkusme nyní psát přes 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 vyhráno zpět z předchozího příkladu

Nyní se podívejte na předposlední a poslední příklad nad námi. Pojďme se podívat, jak se to dá kombinovat. přemýšlejte... jak můžete více 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 vyhrál 5 % času...

Jak to funguje a proč je to rychlejší. Ale $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.

V PHP se hodnoty FALSE a NULL a jejich přidružené hodnoty liší od toho, co je obvyklé v jiných jazycích, a mají své vlastní ne zcela zř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 viditelnost celého obrazu, pro zkušené čtenáře - pro osvěžení paměti, pokud jim z hlavy vyklouzla nějaká nuance.

FALSE ve výrazech If

Podle dokumentace PHP jsou následující hodnoty po přetypování na logickou hodnotu FALSE:
  • samotná booleovská hodnota FALSE
  • prázdný řetězec ("") a řetězec "0" .
  • prázdné pole (pole) - pole().
  • 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:
if (...) echo "1"; jinak echo "0";
pak se zobrazí ř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 byste měli používat pouze v extrémních případech, kdy jste to dobře mysleli a nejsou žádné jiné vhodné možnosti. Viz funkce isset().

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

is_null() vrací TRUE pouze pro proměnné, kterým nebyla přiřazena žádná hodnota nebo jim byla přiřazena hodnota NULL .
isset() vrací jednu ku jedné opačné booleovské hodnoty 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é.

Všimněte si, že na rozdíl od proměnných musíte pro práci s konstantami použít konstrukci define().

řetězcová reprezentace

Zvažte řetězcovou reprezentaci falešných konstant.
Například při zřetězení se hodnoty převedou na následující řetězce, 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 se vrátí na hodnotu true podle očekávání při porovnání s FALSE pomocí operátoru "==".
Při vzájemném porovnávání falešných řetězcových konstant by se zde ale nemělo počítat s tranzitivitou.
Zde je kompletní srovnávací tabulka nepravdivých hodnot (plus označuje prvky tabulky, které při porovnání pomocí operátoru „ != “ vrátí skutečnou hodnotu:

$undef je proměnná, které nebyla přiřazena žádná hodnota

Z tabulky lze vyvodit několik příjemných závěrů:
1. Pokud víme, že používáme pouze řetězce, můžeme je 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 a reálným číslům.

Vzhledem k tomu, že typy různých falešných konstant jsou různé, můžete k jejich rozlišení použít dvojici operátorů === a !==.
Operátor === vrací hodnotu false pro všechny dvojice hodnot false.
Vrací hodnotu true pouze pro argumenty, kde jeden je nastaven na NULL a druhý není nastaven na žádnou hodnotu.

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

Operátor === vám umožňuje rozlišovat mezi všemi falešnými hodnotami, kromě proměnných s hodnotou NULL, a proměnnými, 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 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 měli mít na paměti, že v PHP se dvě nepravdy nemusí rovnat a proměnné, které se zdají být různé, 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 s jeho pomocí. To může zpomalit program, ale pomůže to předejít překvapením.

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 protáhnu prázdný řetězec.

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 je zkontrolován pomocí isNotEmpty:

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

Pokud je řádek prázdný, ostatní se neprovedou, 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 poradím.

Nevím jak všichni ostatní, ale já osobně jsem opravdu naštvaný, 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ý situaci nepotřebujete příkaz IF.

Jen píšu svou vlastní funkci is_string pro kontrolu typu 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 obsahuje.

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 reference: 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 stačí použít:

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

Vždy používám regex k testování prázdného řetězce, s odkazem na dny CGI/Perl i Javascript, tak proč ne například PHP (ačkoli netestováno)

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

Kde \S představuje jakýkoli 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(starter, 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; }

Nenarazil jsem na nejnovější řešení, které využívá použití smyčky.
Překvapivě je toto řešení mnohem 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, kolik času by bylo ušetřeno, kdyby je napadlo zahrnout tuto tolik potřebnou metodu do první verze.

Obnovit

Vezměte prosím na vědomí, že Steve zahrnul 2 optimalizace smyček, první z nich vykazovala nejlepší výkon, takže níže zveřejním tento kód:

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

V PHP se hodnoty FALSE a NULL a jejich přidružené hodnoty liší od toho, co je obvyklé v jiných jazycích, a mají své vlastní ne zcela zř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 viditelnost celého obrazu, pro zkušené čtenáře - pro osvěžení paměti, pokud jim z hlavy vyklouzla nějaká nuance.

FALSE ve výrazech If

Podle dokumentace PHP jsou následující hodnoty po přetypování na logickou hodnotu FALSE:
  • samotná booleovská hodnota FALSE
  • prázdný řetězec ("") a řetězec "0" .
  • prázdné pole (pole) - pole().
  • 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:
if (...) echo "1"; jinak echo "0";
pak se zobrazí ř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 byste měli používat pouze v extrémních případech, kdy jste to dobře mysleli a nejsou žádné jiné vhodné možnosti. Viz funkce isset().

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

is_null() vrací TRUE pouze pro proměnné, kterým nebyla přiřazena žádná hodnota nebo jim byla přiřazena hodnota NULL .
isset() vrací jednu ku jedné opačné booleovské hodnoty 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é.

Všimněte si, že na rozdíl od proměnných musíte pro práci s konstantami použít konstrukci define().

řetězcová reprezentace

Zvažte řetězcovou reprezentaci falešných konstant.
Například při zřetězení se hodnoty převedou na následující řetězce, 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 se vrátí na hodnotu true podle očekávání při porovnání s FALSE pomocí operátoru "==".
Při vzájemném porovnávání falešných řetězcových konstant by se zde ale nemělo počítat s tranzitivitou.
Zde je kompletní srovnávací tabulka nepravdivých hodnot (plus označuje prvky tabulky, které při porovnání pomocí operátoru „ != “ vrátí skutečnou hodnotu:

$undef je proměnná, které nebyla přiřazena žádná hodnota

Z tabulky lze vyvodit několik příjemných závěrů:
1. Pokud víme, že používáme pouze řetězce, můžeme je 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 a reálným číslům.

Vzhledem k tomu, že typy různých falešných konstant jsou různé, můžete k jejich rozlišení použít dvojici operátorů === a !==.
Operátor === vrací hodnotu false pro všechny dvojice hodnot false.
Vrací hodnotu true pouze pro argumenty, kde jeden je nastaven na NULL a druhý není nastaven na žádnou hodnotu.

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

Operátor === vám umožňuje rozlišovat mezi všemi falešnými hodnotami, kromě proměnných s hodnotou NULL, a proměnnými, 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 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 měli mít na paměti, že v PHP se dvě nepravdy nemusí rovnat a proměnné, které se zdají být různé, 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 s jeho pomocí. To může zpomalit program, ale pomůže to předejít překvapením.

Testování probíhalo 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

Moderní programování dlouho a úspěšně manipulovalo s proměnnými bez typu. Typ proměnné lze předem vynechat a lze jej změnit během provádění programu.

Tento koncept se stal hlavním v obecném programovacím paradigmatu. Na samém začátku éry programování jazyky se stejnou základní jistotou vyžadovaly, aby programátor předem deklaroval proměnné a přísně zajistil, aby jim nebylo přiřazeno nic nezákonného. To, že proměnná mění svůj typ, neměly ani programy ani programovací jazyky předtím tušení.

O prázdné a neexistující

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

Podle definice je isset() navržena pro kontrolu existence proměnné. Je jedno, 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 z jejích tvarů, ať už je to řetězec ("0") nebo číslo ( zlomkové - 0,0 nebo celé číslo - 0) stejně: empty($iVar) bude pravda.

O zabezpečení a kontrole

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

PHP nabízí moderní syntaxi, která zachovává dobře 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 z nich, které chybí nebo mají nesprávné hodnoty, musí být uvedeny 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á část bude 20.

Výsledek bude typu číslo a funkce PHP empty($a) vrátí false, což znamená, že $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 chcete, tedy výsledek funkce. A když se volá:

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

tělo funkce získá pouze jeden parametr s hodnotou "$aVal . $bVal" a tento parametr bude pravděpodobně interpretován jako znakový řetězec.

PHP empty() pro objekty a pole

Syntaxe jazyka má dostatečné množství konstrukcí a funkcí pro práci s objekty a poli, nicméně z hlediska jejich kontroly na existenci a na přítomnost hodnoty 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 důležité úvahy týkající se objektů. Pokud jde o kontrolu existence objektu (isset), otázka sotva dává smysl. Pokud jde o funkci empty() PHP, její užitečnost zůstává otázkou.

Podle logiky objektově orientovaného programování má objekt svůj vlastní obsah a vlastní sadu metod. Pouze samotný objekt může říci, 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 se měl každý objekt posuzovat v kontextu jeho chápání „prázdnoty“. Například implementace objektu "Personál" se skládá z evidence "Zaměstnanec". Ale pokud tam není jediný zaměstnanec, tak v "Staffingu" jsou vždy možnosti pro pozice potenciálních zaměstnanců.

Na jaké úrovni zde použít funkci prázdného objektu PHP? Na úrovni "Staffing" vše existuje, i když tam není jediný zaměstnanec. Na úrovni "Zaměstnanec" se objekt již nachází, i když není zcela zaplněn. A ne zcela vyplněný objekt lze připsat prázdnému objektu. Pro personální stůl z toho není žádný užitek.

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