(PHP 4, PHP 5, PHP 7)
str_replace - Nahradí všechny výskyty hledaného řetězce náhradním řetězcem
Popis
Tato funkce vrátí řetězec nebo pole se všemi výskyty hledání v předmětu nahrazené nahrazením.
Pokud nepotřebujete složitá pravidla pro vyhledávání / nahrazování (např. regulární výrazy), je tato funkce preferována. preg_replace ().
Seznam parametrů
Pokud jsou hledání a nahrazování pole, pak str_replace () používá každou hodnotu z odpovídajícího pole pro vyhledávání a nahrazování v předmětu. Pokud má nahrazující pole méně prvků než hledání, jako náhradní řetězec pro zbývající hodnoty bude použit prázdný řetězec. Pokud je hledání pole a nahrazení je řetězec, bude tento náhradní řetězec použit pro každý prvek ve vyhledávacím poli. Opačný případ nedává smysl.
Pokud jsou pole hledat nebo nahrazovat, jejich prvky budou zpracovány od prvního do posledního.
Hodnota, kterou je třeba hledat, známá také jako jehla(jehla). Pro sadu požadovaných hodnot můžete použít pole.
Nahradit
Hodnota nahrazení bude použita k nahrazení hledání hodnot hledání. Pro více hodnot můžete použít pole.
Předmět
Řetězec nebo pole, které se má vyhledat a nahradit, známé také jako kupka sena(kupka sena).
Pokud je předmět pole, pak se nad každým předmětem předmětu provede hledání náhrady a funkce také vrátí pole.
Pokud projde, bude nastaven na počet provedených výměn.
Návratové hodnoty
Tato funkce vrací řetězec nebo pole s nahrazenými hodnotami.
Příklady
Příklad č. 1 Příklady použití str_replace ()
// přiřadí
$ bodytag = str_replace ("% body%", "black", "
// přiřadí: Hll Wrld f PHP
$ samohlásky = pole ("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$ onlyconsonants = str_replace ($ samohlásky, "", "Ahoj světe PHP");
// přiřadí: Měli byste jíst pizzu, pivo a zmrzlinu každý den
$ fráze = "Měli byste jíst ovoce, zeleninu a vlákninu každý den.";
$ zdravé = pole ("ovoce", "zelenina", "vláknina");
$ mňam = pole ("pizza", "pivo", "zmrzlina");
$ newphrase = str_replace ($ zdravé, $ mňam, $ fráze);
// přiřadí: 2
$ str = str_replace ("ll", "", "dobrá slečno Molly!", $ count);
echo $ počet;
?>
Příklad č. 2 Příklady možných triků s str_replace ()
// Objednávka výměny
$ str = "Řádek 1 \ n řádek 2 \ r řádek 3 \ r \ n řádek 4 \ n";
$ order = pole ("\ r \ n", "\ n", "\ r");
$ nahradit = "
"
;
// Zpracuje \ r \ n jako první, aby nedošlo k jejich opětovnému nahrazení.
echo $ newstr = str_replace ($ objednávka, $ nahradit, $ str);
// Vytiskne F, protože A je nahrazeno B, pak B C a tak dále...
// V důsledku toho bude E nahrazeno F, protože nahrazení je zleva doprava.
$ hledat = pole ("A", "B", "C", "D", "E");
$ nahradit = pole ("B", "C", "D", "E", "F");
$ předmět = "A";
echo str_replace ($ hledat, $ nahradit, $ předmět);
// Výstupy: jablko-ořech ořech (z výše uvedeného důvodu)
$ písmena = pole ("i", "o");
$ ovoce = pole ("jablko", "ořech");
$ text = "Chystám se";
$ output = str_replace ($ písmena, $ ovoce, $ text);
echo $ výstup;
?>
Poznámky (upravit)
Komentář: Tato funkce je bezpečná pro zpracování dat v binární podobě.
Varování
Poznámka k výměně
Protože str_replace () provede výměnu zleva doprava, při použití více záměn pak může nahradit dříve vloženou hodnotu jinou. Viz také příklady na této stránce.
Komentář:
Tato funkce rozlišuje malá a velká písmena. Použití str_ireplace () pro výměnu bez ohledu na velikost písmen.
Komentář: PHP 7.0.0 na 64bitových platformách nemá žádné limity dosažitelné délky řetězce, na 32bitových systémech a dřívějších verze PHP, řádky nemohou být větší než 2 GB (2147483647 bajtů).
Syntax
Řetězec může být specifikován čtyřmi různé způsoby:
- jednoduché uvozovky
- dvojité uvozovky
- syntaxe nowdoc (od PHP 5.3.0)
Jednoduché uvozovky
Nejjednodušší způsob definovat řetězec znamená uzavřít jej do jednoduchých uvozovek ( " ).
Chcete-li v řetězci použít jednu uvozovku, uzavřete ji zpětným lomítkem ( \ ). Pokud potřebujete napsat zpětné lomítko samotné, zkopírujte jej ( \\ ). Všechna ostatní použití zpětného lomítka budou interpretována jako normální znaky, což znamená, že pokud se pokusíte použít jiné escape sekvence jako např. \ r nebo \ n, budou zobrazeny tak, jak jsou, namísto jakéhokoli zvláštního chování.
echo "toto je jednoduchý řetězec";
echo „Lze vkládat i do řádků
postava z nového řádku, jako je tato,
to je normální";
// Výstupy: Arnold jednou řekl: "Já se vrátím"
echo "Arnold jednou řekl," já \ "vrátím se";
Echo "Odstranili jste C: \\ *. *?";
// Výstupy: Odstranili jste C: \ *. *?
echo "Odstranili jste C: \ *. *?" ;
// Výstupy: Toto nebude rozbaleno: \ n nový řádek
echo "Toto nebude rozbaleno: \ n nový řádek";
// Výstupy: Proměnné $ expandují také $ buď nejsou expandovány
echo "Proměnné $ expandují také $ expandují";
?>
Dvojité uvozovky
Pokud je řetězec uzavřen do dvojitých uvozovek ("), PHP rozpozná následující sekvence escape pro speciální znaky:
Sekvence | Význam |
---|---|
\ n | nový řádek (LF nebo 0x0A (10) v ASCII) |
\ r | návrat vozíku (CR nebo 0x0D (13) v ASCII) |
\ t | horizontální karta (HT nebo 0x09 (9) v ASCII) |
\ v | vertikální karta (VT nebo 0x0B (11) v ASCII) (od PHP 5.2.5) |
\ e | escape znak (ESC nebo 0x1B (27) v ASCII) (od PHP 5.4.4) |
\ f | seznam stránek (FF nebo 0x0C (12) v ASCII) (od PHP 5.2.5) |
\\ | obrácené lomítko |
\$ | znak dolaru |
\" | dvojitá citace |
\{1,3} | posloupnost znaků odpovídajících znaku regulárního výrazu v osmičkové soustavě, která tiše přeteče, aby se vešla do bajtu (tj. "\ 400" === "\ 000") |
\ x (1,2) | posloupnost znaků odpovídajících znaku regulárního výrazu v hexadecimálním zápisu |
\ u (+) | sekvence znaků odpovídajících regulárnímu výrazu znaků Unicode, který se mapuje na řetězec v notaci UTF-8 (přidáno v PHP 7.0.0) |
Stejně jako u řetězce uzavřeného v jednoduchých uvozovkách, escapování libovolného znaku také vypíše samotný escape znak. Před PHP 5.1.1 zpětné lomítko in \ ($ var) nebyl vytištěn.
Heredoc
Třetí způsob, jak definovat řetězce, je pomocí syntaxe heredoc: <<< ... Po tomto operátoru musíte zadat identifikátor a poté odřádkování. Poté následuje samotný řádek a poté stejný identifikátor, který uzavírá vložku.
Čára by měl začít uzavíracím identifikátorem, tzn. musí být v prvním sloupci řádku. Identifikátor se navíc musí řídit stejnými pravidly pro pojmenování jako všechny ostatní značky v PHP: obsahovat pouze alfanumerické znaky a podtržítko a nesmí začínat číslem (podtržítka jsou povolena).
Pozornost
Je velmi důležité si uvědomit, že řádek s koncovým identifikátorem nesmí obsahovat žádné další znaky, s výjimkou středníku ( ; ). To znamená, že identifikátor nesmí být odsazené a že před ani za středníkem nesmí být žádné mezery ani tabulátory. Je také důležité pochopit, že první znak před koncovým identifikátorem musí být znak nového řádku, jak je definováno vaším operačním systémem. Například na systémech UNIX, včetně macOS, je tomu tak \ n... Bezprostředně za koncovým identifikátorem musí také začínat nový řádek.
Pokud je toto pravidlo porušeno a koncový identifikátor není „čistý“, považuje se koncový identifikátor za chybějící a PHP jej bude dále hledat. Pokud v tomto případě stále není nalezen správný uzavírací identifikátor, způsobí to chybu analýzy s číslem řádku na konci skriptu.
Příklad č. 1 Příklad nesprávné syntaxe
třída foo (
veřejný $ bar =<<
EOT;
// odsazení před koncovým identifikátorem není povoleno
}
?>
Příklad # 2 Příklad správné syntaxe
třída foo (
veřejný $ bar =<<
EOT;
}
?>
Heredoc nelze použít k inicializaci polí třídy. Od PHP 5.3 se toto omezení vztahuje pouze na heredocs obsahující proměnné.
Text Heredoc se chová stejně jako řetězec s dvojitými uvozovkami, aniž by je měl. To znamená, že v heredoc nemusíte uvozovky escapovat, ale stále můžete použít výše uvedené sekvence escapování. Proměnné se zpracovávají, ale při použití složitých proměnných uvnitř heredocu musíte být stejně opatrní jako při práci s řetězci.
Příklad č. 3 Příklad definování řetězce heredoc
$ str =<<
přes několik řádků,
pomocí syntaxe heredoc.
EOD;
Třída foo
{
var $ foo;
var $ bar;
Funkce __construct ()
{
$ this -> foo = "Foo";
$ toto ->
}
}
$ foo = nový foo ();
$ name = "Jméno";
echo<<
Teď vytáhnu($ foo -> bar [1]) .
Výsledkem by mělo být velké "A": \ x41
EOT;
?>
Jmenuji se "Imarek". Píšu Foo. Nyní zobrazujem Bar2. Výsledkem by mělo být velké písmeno "A": A
Je také možné použít syntaxi heredoc k předání dat prostřednictvím argumentů funkce:
Počínaje verzí 5.3.0 bylo možné inicializovat statické proměnné a vlastnosti / konstanty třídy pomocí syntaxe heredoc:
Příklad č. 5 Použití heredoc k inicializaci statických proměnných
// Statické proměnné
funkce foo ()
{
statický $ bar =<<
// Konstanty třídy / vlastnosti
třída foo
{
const BAR =<<
FOOBAR;
Veřejné $ baz =<<
FOOBAR;
}
?>
Od PHP 5.3.0 můžete také umístit identifikátor Heredoc do dvojitých uvozovek:
Nowdoc
Nowdoc je stejný pro řetězce v jednoduchých uvozovkách jako heredoc pro řetězce s dvojitými uvozovkami. Nowdoc je jako heredoc, ale uvnitř nejsou prováděny žádné substituce... Tato konstrukce je ideální pro vkládání kódu PHP nebo jiných velkých bloků textu bez nutnosti escapování. V tomto je to trochu jako konstrukt SGML. prohlášením bloku textu ke zpracování.
Nowdoc je označen stejnou sekvencí <<< , který se používá v heredoc, ale následující identifikátor je uzavřen v jednoduchých uvozovkách, např. <<<"EOT" ... Všechny podmínky, které platí pro identifikátory heredoc, platí také pro nowdoc, zejména ty, které se týkají uzavíracího identifikátoru.
Příklad č. 7 Příklad použití nowdoc
echo<<<"EOD"
Ukázkový text,
přes několik řádků,
pomocí syntaxe nowdoc. S zpětnými lomítky se vždy zachází doslova,
například \\ a \ ".
EOD;
Výsledek tohoto příkladu:
Ukázkový text zahrnující více řádků pomocí syntaxe nowdoc. Zpětná lomítka jsou vždy zpracována doslova, například \\ a \ ".
Příklad č. 8 Příklad citování řetězce Nowdoc s proměnnými
/ * Složitější příklad s proměnnými. * /
třída foo
{
veřejné $ foo;
veřejný $ bar;
Funkce __construct ()
{
$ this -> foo = "Foo";
$ this -> bar = pole ("Bar1", "Bar2", "Bar3");
}
}
$ foo = nový foo ();
$ name = "Jméno";
echo<<<"EOT"
Jmenuji se "$ name". Píšu $ foo-> foo.
Teď píšu ($ foo-> bar).
To by nemělo vytisknout velké "A": \ x41
EOT;
?>
Výsledek tohoto příkladu:
Jmenuji se "$ name". Píšu $ foo-> foo. Teď píšu ($ foo-> bar). To by nemělo vytisknout velké "A": \ x41
Příklad č. 9 Příklad použití statických dat
třída foo (
veřejný $ bar =<<<"EOT"
bar
EOT;
}
?>
Komentář:
Podpora Nowdoc byla přidána do PHP 5.3.0.
Variabilní manipulace
Pokud je řetězec zadán v uvozovkách nebo pomocí heredoc, jsou zpracovány proměnné v něm obsažené.
Existují dva typy syntaxe: jednoduchá a složitá. Jednoduchá syntaxe je jednodušší a pohodlnější. Umožňuje zpracovat proměnnou, hodnotu pole ( pole) nebo vlastnosti objektu ( objekt) s minimálním úsilím.
Složitou syntaxi lze identifikovat podle složených závorek obklopujících výraz.
Jednoduchá syntaxe
Pokud tlumočník narazí na znak dolaru ( $ ), zachytí co nejvíce znaků, aby vytvořil správný název proměnné. Pokud chcete přesně definovat konec názvu, uzavřete název proměnné do složených závorek.
$ šťáva = "jablko";
echo "Vypil nějaký $ džus." ... PHP_EOL;
// Špatně. "s" je platný znak pro název proměnné, ale proměnná se jmenuje $ juice.
echo "Vypil nějaký džus vyrobený z $ džusů." ;
// Správně. Konec názvu proměnné je přesně specifikován pomocí závorek:
echo "Vypil nějaký džus vyrobený z $ (džusu) s." ;
?>
Výsledek tohoto příkladu:
Vypil trochu jablečného džusu. Vypil trochu připravené šťávy. Vypil trochu jablečného džusu.
Element pole ( pole) nebo vlastnost objektu ( objekt). V indexech pole je uzavírací hranatá závorka ( ] ) označuje konec definice indexu. Pro vlastnosti objektu platí stejná pravidla jako pro jednoduché proměnné.
Příklad č. 10 Jednoduchý příklad syntaxe
definovat ("KOOLAID", "koolaid1");
$ šťávy = pole ("jablko", "pomeranč", "koolaid1" => "fialová");
echo "Vypil nějaké $ džusy [0] džus." ... PHP_EOL;
echo "Vypil nějaké $ džusy [1] džus." ... PHP_EOL;
echo "Vypil nějaké $ džusy [koolaid1] džus." ... PHP_EOL;
třídní lidé (
public $ john = "John Smith";
public $ jane = "Jane Smith";
public $ robert = "Robert Paulsen";
Veřejné $ smith = "Smith";
}
$ lidé = noví lidé ();
echo "$ lidí -> John vypil $ džusy [0] džus." ... PHP_EOL;
echo "$ people -> john pak pozdravil $ people -> jane." ... PHP_EOL;
echo "$ people -> john" manželka pozdravila $ people -> robert. ". PHP_EOL;
echo "$ lidi -> robert pozdravil dva $ lidi -> kováři." ; // To nebude fungovat
?>
Výsledek tohoto příkladu:
Vypil trochu jablečného džusu. Vypil trochu pomerančového džusu. Vypil trochu fialového džusu. John Smith vypil trochu jablečného džusu. John Smith pak řekl ahoj Jane Smith. Manželka Johna Smithe pozdravila Roberta Paulsena. Robert Paulsen ty dva pozdravil.
PHP 7.1.0 přidává podporu pro zápornýčíselné indexy.
Příklad č. 11 Záporné číselné indexy
$ řetězec = "řetězec";
echo "Znak s indexem -2 je$ řetězec [- 2].", PHP_EOL;
$ string [- 3] = "o";
echo "Změnou znaku na pozici -3 na" o "se zobrazí následující řádek:$ string. ", PHP_EOL;
?>
Výsledek tohoto příkladu:
Znak s indexem -2 je n. Změnou znaku na pozici -3 na "o" vznikne následující řádek: silný
Pro cokoliv složitějšího použijte komplexní syntaxi.
Složitá (složená) syntaxe
Říká se tomu obtížné ne proto, že je obtížné mu porozumět, ale proto, že umožňuje použití složitých výrazů.
Jakákoli skalární proměnná, prvek pole nebo vlastnost objektu namapovaná na řetězec mohou být reprezentovány na řetězci s touto syntaxí. Stačí napsat výraz stejným způsobem jako mimo řádek a poté jej uzavřít { a } ... Pokud { nelze escapovat, tato syntaxe bude rozpoznána pouze tehdy $ následuje bezprostředně poté { ... Použití {\$ vytisknout {$ ... Několik názorných příkladů:
// Zobrazit všechny chyby
chybové hlášení (E_ALL);
$ skvělý = "skvělý";
// Nefunguje, výstupy: To je (skvělé)
echo "To je ($ skvělé)";
// Práce, výstupy: To je skvělé
echo "To je ($ skvělé)";
// Pracovní
echo „Tohle náměstí je široké($ čtverec -> šířka) 00 centimetrů. ";
// Funguje, klíče v uvozovkách fungují pouze se syntaxí složených závorek
echo "Toto funguje: ($ arr [" klíč "])";
// Pracovní
echo "Funguje to: ($ arr [4] [3])";
// Toto je nesprávné ze stejného důvodu jako $ foo venku
// řetězce. Jinými slovy, bude to stále fungovat.
// ale protože PHP nejprve hledá konstantní foo, toto zavolá
// Chyba úrovně E_NOTICE (nedefinovaná konstanta).
echo "Není to správné:($ arr [foo] [3]) ";
// Pracovní. Při použití vícerozměrných polí interně
// řetězce vždy používají složené závorky
echo "Funguje to: ($ arr [" foo "] [3])";
// Pracovní.
echo "To funguje:". $ arr ["foo"] [3];
echo "Tohle taky funguje:($ obj -> hodnoty [3] -> název) ";
echo "Toto je hodnota proměnné podle názvu$ name: ($ ($ name)) ";
echo "Toto je hodnota proměnné podle názvu, kterou vrací funkce getName ():($ (getName ())) ";
echo "Toto je hodnota proměnné podle názvu, kterou \ $ object-> getName () vrací:($ ($ objekt -> getName ())) ";
// Nefunguje, výstupy: Toto je to, co getName () vrací: (getName ())
echo "Toto vrací getName (): (getName ())";
?>
Pomocí této syntaxe je také možné přistupovat k vlastnostem objektů v řetězcích.
třída foo (
var $ bar = "Jsem bar." ;
}
$ foo = nový foo ();
$ bar = "bar";
$ baz = pole ("foo", "bar", "baz", "quux");
echo "($ foo -> $ bar) \ n";
echo "($ foo -> ($ baz [1])) \ n";
?>
Výsledek tohoto příkladu:
jsem bar. jsem bar.
Komentář:
Funkce, volání metod, statické proměnné třídy a konstanty třídy fungují interně {$} od PHP 5. Zadaná hodnota však bude považována za název proměnné ve stejném kontextu jako řetězec, ve kterém je definována. Použití jednoduchých složených závorek ( {} ) nebude fungovat pro přístup k hodnotám funkcí, metod, konstant třídy nebo statických proměnných třídy.
// Zobrazit všechny chyby
chybové hlášení (E_ALL);
třídní piva (
const softdrink = "kořenové pivo";
veřejné statické $ ale = "ipa";
}
$ rootbeer = "A & W";
$ ipa = "Alexander Keith \" s ";
// Funguje to, výstupy: Chtěl bych A & W
echo "Rád bych ($ (piva :: nealkoholický nápoj)) \ n";
// Toto také funguje, výstupy: Chtěl bych Alexander Keith "s
echo "Chtěl bych ($ (piva :: $ ale)) \ n";
?>
Přístup a úprava znaku v řetězci
Znaky v řetězcích lze používat a upravovat definováním jejich posunu od začátku řetězce, počínaje nulou, v hranatých závorkách za řetězcem, například $ str. Pro tento účel si řetězec představte jako pole znaků. Pokud potřebujete získat nebo nahradit více než 1 znak, můžete použít funkce substr () a substr_replace ().
Komentář: od PHP 7.1.0 jsou podporovány záporné hodnoty offsetu. Nastaví posun od konce řádku. Dříve záporné offsety způsobovaly chybu úrovně E_NOTICE buď při čtení (vracení prázdného řetězce). E_VAROVÁNÍ při psaní (řádek ponechán beze změny).
Komentář: Na znak v řetězci lze také odkazovat pomocí složených závorek, například $ str (42).
Pozornost
Pokus o zápis do off-line offsetu vyplní řádek mezerami až do tohoto offsetu. Neceločíselné typy budou převedeny na celá čísla. Nesprávný typ offsetu způsobí chybu úrovně E_VAROVÁNÍ... Použije se pouze první znak přiřazeného řetězce. Od PHP 7.1.0 způsobí přiřazení prázdného řetězce fatální chybu. Dříve byl v tomto případě přiřazen bajt NULL.
Pozornost
Řetězce v PHP jsou interně pole bajtů. Výsledkem je, že přístup nebo úprava řetězce na offsetu není z hlediska vícebajtového kódování bezpečná a měla by být prováděna pouze s řetězci v jednobajtových kódováních, jako je ISO-8859-1.
Komentář: Počínaje PHP 7.1.0 způsobuje použití prázdného indexu fatální chybu, dříve v podobném případě byl řetězec bez varování převeden na pole.
Příklad č. 12 Několik příkladů řetězců
// Získá první znak řetězce
$ str = "Toto je test." ;
$ první = $ str [0];
// Získá třetí znak řetězce
$ třetí = $ str [2];
// Získání posledního znaku řetězce
$ str = "Toto je stále test." ;
$ last = $ str [strlen ($ str) - 1];
// Změna posledního znaku řádku
$ str = "Podívejte se na moře";
$ str [strlen ($ str) - 1] = "e";
?>
Od PHP 5.4 musí být offset v řetězci specifikován buď jako celé číslo nebo jako řetězec obsahující čísla, jinak bude vydáno varování. Dříve offset určený řádkem formuláře "foo", bez varování převedeny na 0 .
Příklad č. 13 Rozdíly mezi PHP 5.3 a PHP 5.4
$ str = "abc";
Var_dump ($ str ["1"]);
var_dump (isset ($ str ["1"]));
Var_dump ($ str ["1.0"]);
var_dump (isset ($ str ["1.0"]));
Var_dump ($ str ["x"]);
var_dump (isset ($ str ["x"]));
Var_dump ($ str ["1x"]);
var_dump (isset ($ str ["1x"]));
?>
Výsledek spuštění tohoto příkladu v PHP 5.3:
řetězec (1) "b" bool (true) řetězec (1) "b" bool (true) řetězec (1) "a" bool (true) řetězec (1) "b" bool (true)
Výsledek spuštění tohoto příkladu v PHP 5.4:
řetězec (1) "b" bool (true) Varování: Neplatný posun řetězce "1.0" v /tmp/t.php na řádku 7 řetězec (1) "b" bool (false) Varování: Neplatný posun řetězce "x" v / tmp / t.php na řádku 9 řetězec (1) "a" bool (false) řetězec (1) "b" bool (false)
Komentář:
Pokus o přístup k proměnným jiných typů (s výjimkou polí nebo objektů, které implementují určitá rozhraní) pomocí nebo {} tiše vrátit NULA.
Komentář:
PHP 5.5 přidalo podporu pro přístup ke znakům v řetězcových literálech pomocí syntaxe nebo {} .
Existuje mnoho užitečných funkcí pro úpravu řetězců.
Základní funkce jsou popsány v části o řetězcových funkcích a pro pokročilé vyhledávání a nahrazování funkce regulárních výrazů kompatibilních s Perl.
Převod na řetězec
Hodnotu lze převést na řetězec pomocí přetypování (tětiva), nebo funkce strval ()... Ve výrazech, kde je potřeba řetězec, proběhne převod automaticky. K tomu dochází při použití funkcí echo nebo tisk, nebo když je hodnota proměnné porovnána s řetězcem. Přečtením částí příručky Typy a Manipulace s typy bude následující jasnější. viz také settype ().
Pole jsou vždy převedeny na řetězec "Pole" takže nemůžete zobrazit obsah pole ( pole) použitím echo nebo tisk abyste viděli, co obsahuje. Chcete-li zobrazit jednotlivou položku, použijte něco jako echo $ arr ["foo"]... Níže naleznete tipy, jak zobrazit/zobrazit veškerý obsah.
Chcete-li převést proměnnou na typ "Objekt" v typu tětiva používá se magická metoda __toString.
Význam NULA vždy převede na prázdný řetězec.
Jak můžete vidět výše, přímý převod na řetězec polí, objektů nebo zdrojů neposkytuje žádné užitečné informace o hodnotách samotných, kromě jejich typů. Lepším způsobem výstupu hodnot pro ladění je použití funkcí print_r () a var_dump ().
Většinu hodnot v PHP lze převést na řetězec pro trvalé uložení. Tato metoda se nazývá serializace a lze ji provést pomocí funkce serializovat ().
Převod řetězců na čísla
Pokud je řetězec rozpoznán jako číselná hodnota, výsledná hodnota a typ se určí tak, jak je uvedeno níže.
Pokud řetězec neobsahuje žádný ze znaků ".", "E" nebo "E" a hodnota čísla je umístěna v rozsahu celých čísel (definováno PHP_INT_MAX), bude řetězec rozpoznán jako celé číslo ( celé číslo). Ve všech ostatních případech se považuje za číslo s pohyblivou řádovou čárkou ( plovák).
Hodnota je určena začátkem řetězce. Pokud řetězec začíná platnou číselnou hodnotou, použije se tato hodnota. Jinak bude hodnota 0 (nula). Platná číselná hodnota je jedna nebo více číslic (které mohou obsahovat desetinnou čárku), před kterými může být znaménko následované volitelným exponentem. Exponent je "e" nebo "E" následované jednou nebo více číslicemi.
$ foo = 1 + "10,5"; // $ foo is float (11.5)
$ foo = 1 + "-1,3e3"; // $ foo is float (-1299)
$ foo = 1 + "bob-1.3e3"; // $ foo je celé číslo (1)
$ foo = 1 + "bob3"; // $ foo je celé číslo (1)
$ foo = 1 + "10 malých prasat"; // $ foo je celé číslo (11)
$ foo = 4 + "10.2 malá prasátka"; // $ foo is float (14.2)
$ foo = "10,0 prasat" + 1; // $ foo is float (11)
$ foo = "10,0 prasat" + 1,0; // $ foo is float (11)
?>
Další informace o této konverzi naleznete v části strtod (3) v dokumentaci k Unixu.
Pokud chcete otestovat některý z příkladů v této části, zkopírujte jej a vložte jej a následující řádek, abyste viděli, co se stane:
echo "\ $ foo == $ foo; typ:". gettype ($ foo). "
\ n ";
?>
Nečekejte, že kód znaku získáte převodem na celé číslo (jak se to dělá například v C). Chcete-li převést znaky na jejich kódy ASCII a naopak, použijte funkce ord () a chr ().
Podrobnosti implementace typu řetězce
před 7 lety
Dokumentace to nezmiňuje, ale koncový středník na konci heredoc je ve skutečnosti interpretován jako skutečný středník a jako takový někdy vede k syntaktickým chybám.
$ foo =<<
KONEC;
?>
Toto neplatí:
foo (<<
KONEC;
);
// chyba syntaxe, neočekávané ";"
?>
Bez středníku to funguje dobře:
foo (<<
KONEC
);
?>
před 3 lety
Můžete použít řetězec jako pole znaků (jako C)
$ a = "Test pole řetězců";
var_dump ($ a);
// Návratový řetězec (17) "Test pole řetězců"
var_dump ($ a);
// Návratový řetězec (1) "S"
// - S přetypováním pole -
var_dump ((pole) $ a);
// Návrat pole (1) (=> řetězec (17) "Test pole řetězců")
var_dump ((pole) $ a);
// Návratový řetězec (17) "S"
Norihiori
před 15 lety
Pomocí složité syntaxe můžete vložit hodnotu obou vlastností objektu A metod objektu do řetězce. Například ...
třídní test (
veřejný $ jeden = 1;
veřejná funkce dvě () (
návrat 2;
}
}
$ test = nový test ();
echo "foo ($ test -> jeden) pruh ($ test -> dva ())";
?>
Bude vydávat „foo 1 bar 2“.
Nemůžete to však udělat pro všechny hodnoty ve vašem jmenném prostoru. Konstanty třídy a statické vlastnosti / metody nebudou fungovat, protože složitá syntaxe hledá "$".
třídní test (
const JEDNA = 1;
}
echo "foo (Test :: JEDEN) bar";
?>
Výsledkem bude „foo (Test :: one) bar“. Konstanty a statické vlastnosti vyžadují, abyste řetězec přerušili.
před 3 lety
Pozor, v souladu s „Převod řetězce na čísla“:
If ("123abc" == 123) echo "(intstr == int) nesprávně testuje jako pravdivé.";
// Protože jedna strana je číslo, řetězec je nesprávně převeden z intstr na int, který pak odpovídá testovacímu číslu.
// Platí pro všechny podmínky, jako jsou příkazy if a switch (pravděpodobně také cykly while)!
// To může být velké bezpečnostní riziko při testování / používání / ukládání uživatelského vstupu, zatímco očekáváte a testujete pouze celé číslo.
// Zdá se, že jedinou opravou je, aby 123 byl řetězec jako "123", takže nedojde k žádné konverzi.
?>
před 6 lety
Počáteční nuly v řetězcích nejsou (nejmenší překvapení) považovány za osmičkové.
Zvážit:
$ x = "0123" + 0;
$ y = 0123 + 0;
echo "x je $ x, y je $ y"; // vypíše "x je 123, y je 83"
jinými slovy:
* úvodní nuly v číselných literálech ve zdrojovém kódu jsou interpretovány jako "osmičkové", srov. strtol ().
* úvodní nuly v řetězcích (např. data odeslaná uživatelem) jsou při přetypování (implicitně nebo explicitně) na celé číslo ignorovány a považovány za desítkové, srov. strtod ().
před 10ti lety
Zde je snadný hack, který umožní řetězcům a heredocům ve dvojitých uvozovkách obsahovat libovolné výrazy v syntaxi složených závorek, včetně konstant a dalších volání funkcí:
// Prohlášení o hacku
funkce _expr ($ v) (návrat $ v;)
$ _expr = "_expr";
// Naše hřiště
definovat ("qwe" ,
"asd");
definovat("zxc",
5
);
$ a=
3
;
$ b=
4
;
funkce C($ a, $ b) (vrátit se$ a+ $ b; }
// Použití
echo"před{
$ _expr(1
+
2
)}
příspěvek \ n ";
// výstupy "pre 3 post"
echo"před{
$ _expr(qwe)}
příspěvek \ n ";
// výstupy "pre asd post"
echo"před{
$ _expr(C($ a,
$ b)+
zxc*
2
)}
příspěvek \ n ";
// výstupy "pre 17 post"
// Obecná syntaxe je ($ _expr (...))
?>
Před 2 roky
Myslel jsem, že by bylo užitečné přidat tento komentář, aby se informace objevily alespoň na správné stránce na webu PHP.
Všimněte si, že pokud máte v úmyslu použít řetězec ve dvojitých uvozovkách s asociativním klíčem, můžete narazit na chybu T_ENCAPSED_AND_WHITESPACE. Někteří to považují za jednu z méně zjevných chybových zpráv.
Výraz jako:
$ ovoce= pole (
"A"=>
"jablko",
"b"=>
"banán",
// atd
);
Tisk "Toto je a$ ovoce[
"a"] ";
// T_ENCAPSED_AND_WHITESPACE
?>
se určitě rozpadne na kusy.
Můžete to vyřešit následovně:
tisk"Toto je a$ ovoce[
A]
"
;
// zrušte citaci klíče
tisk"Toto je a${
ovoce[
"A"]}
"
;
// Složitá syntaxe
tisk"Toto je a{
$ ovoce[
"A"]}
"
;
// Komplexní variace syntaxe
?>
Osobně preferuji poslední variantu, protože je přirozenější a blíže tomu, jaký by byl výraz mimo řetězec.
Není jasné (alespoň mně), proč PHP chybně interpretuje jedinou uvozovku uvnitř výrazu, ale myslím si, že to má něco společného s tím, že uvozovky nejsou součástí řetězce hodnoty - jakmile je řetězec již analyzován, uvozovky prostě překážet...?
Před 2 roky
Obojí by mělo fungovat :(
třídaTestování{ Veřejná funkce řekniHelloStatic() { Veřejná funkce řekniHelloConst() {
$ obj= novýTestování(); před 3 lety Něco, co jsem zažil, co bezpochyby někomu pomůže. ... ... $ html =<<<"EOD" Pomocí tohoto zobrazíte všechny stejnou barvu: $ html =<< práce s ním je mnohem jednodušší před 11 lety Abyste si zachránili mysl, nečtěte předchozí komentáře o datech;) Když lze oba řetězce převést na numerické (v testu ("$ a"> "$ b")), použijí se výsledná numerická čísla, jinak se porovnávají FULL řetězce char-by-char: var_dump("1.22"
>
"01.23"
);
// bool (false) Vyhledá v předmětu shodu se vzorem a nahradí je náhradou. Pokud je zadán parametr limit, budou nahrazeny limitní výskyty šablony; pokud je limit vynechán nebo je roven -1, všechny výskyty vzoru budou nahrazeny. Nahrazení může obsahovat odkazy ve tvaru \\ n nebo (od PHP 4.0.4) $ n, přičemž přednost se dává druhému. Každý takový odkaz bude nahrazen podřetězcem odpovídajícím podvzoru n „n“ uzavřenému v závorkách. N může nabývat hodnot od 0 do 99 a odkaz \\ 0 (nebo $ 0) odpovídá celému vzoru. Podvzory jsou číslováno zleva doprava, počínaje jedničkou... Při použití zástupných znaků pomocí odkazů na podvzory může být možné, aby číslo bezprostředně následovalo masku. V tomto případě způsobí zápis \\ n chybu: odkaz na první podvzor následovaný číslem 1 bude zapsán jako \\ 11, což bude interpretováno jako odkaz na jedenáctý podvzor. Tento zmatek lze odstranit pomocí konstruktu \ $ (1) 1, který ukazuje na izolovaný odkaz na první podvzor, za kterým následuje číslice 1. Výstupem tohoto příkladu bude: Pokud je během provádění funkce nalezena shoda vzoru, bude vrácena upravená hodnota předmětu, jinak bude vrácen původní předmět. První tři parametry funkce preg_replace () mohou být jednorozměrná pole. Pokud pole používá klíče, budou při zpracování pole převzaty v pořadí, v jakém jsou umístěny v poli. Klíče pole pro vzor a výměnu jsou volitelné. Pokud se přesto rozhodnete použít indexy ke spárování vzorů a řetězců zahrnutých do nahrazení, použijte funkci ksort () pro každé z polí. Příklad 2. Použití polí s číselnými indexy jako argumenty funkce preg_replace ()
Výsledek: Výsledek: Pokud je parametrem předmětu pole, pro každý jeho prvek se provede vyhledávání a nahrazení zástupných znaků. Vráceným výsledkem bude také pole. V případě, že parametry pattern a nahrazení jsou pole, preg_replace () střídavě načte pár prvků z obou polí a použije je pro operaci hledání a nahrazení. Pokud náhradní pole obsahuje více prvků než vzor, místo chybějících prvků budou nahrazeny prázdné řetězce. Pokud je vzor pole a nahrazení je řetězec, bude každý prvek pole vzorů vyhledán a nahrazen vzorem (vzorem budou střídavě všechny prvky pole, zatímco náhradní řetězec zůstane pevný). Varianta, kdy vzor je řetězec a nahrazení je pole, nedává smysl. Modifikátor / e mění chování funkce preg_replace () a to tak, že parametr nahrazení je po provedení nezbytných substitucí interpretován jako PHP kód a teprve poté je použit k nahrazení. Při použití tohoto modifikátoru buďte opatrní: parametr nahrazení musí obsahovat správný PHP kód, jinak v řádku obsahujícím volání funkce preg_replace (), dojde k chybě syntaxe. Příklad 3. Náhrada několika šablonami Tento příklad vypíše: Převede všechny značky HTML na velká písmena Příklad 5. Převodník HTML na text C_id | Společnost | Umístění Typ opravy (repair_types) Seznam objednávek (seznam) Tabulka č. 1 obsahuje seznam klientů. Skutečný problém je v tom, že třetí tabulka by se měla zobrazovat ve webovém formuláři "výběr objednávky" a místo ID je potřeba dosadit odpovídající pole z jiných sloupců. Kód: INSERT INTO "table_name" ("seznam") HODNOT ("bla-bla")
veřejná statika$ VAR=
"statický";
public const VAR ="konst";
echo"Ahoj:{
$ toto::
$ VAR}
"
;
}
echo"Ahoj:{
$ toto:: VAR)"
;
// Chyba analýzy: chyba syntaxe, neočekávané ")", očekává se "["
}
}
$ obj->
řekniHelloStatic();
$ obj->
řekniHelloConst();
V mém editoru to zvýrazní syntaxi HTML a komentář $:
$ komentář
EOD;
EOD;
var_dump("1.22.00"
>
"01.23.00"
);
// bool (pravda)
var_dump("1-22-00"
>
"01-23-00"
);
// bool (pravda)
var_dump((plovák)"1.22.00"
> (plovoucí)"01.23.00"
);
// bool (false)
?>
1. dubna 2003
$ řetězec = "Rychlá hnědá liška přeskočila líného psa."$ vzory [0] = "/ rychle /";
$ vzory [1] = "/ hnědá /";
$ vzory [2] = "/ liška /"; $ nahrazení [2] = "medvěd";
$ nahrazení [1] = "černá";
$ nahrazení [0] = "pomalé"; preg_replace ($ vzory, $ nahrazení, $ řetězec);
?>
Pomalý černý medvěd přeskočil líného psa.
$ vzory = pole ( "/ (19 | 20) (\ d (2)) - (\ d (1,2)) - (\ d (1,2)) /",
"/ ^ \ s * ((\ w +)) \ s * = /");
$ nahradit = pole ("\\ 3 / \\ 4 / \\ 1 \\ 2", "$ \\ 1 =");
echo preg_replace (vzory $, $ nahradit, "(počáteční datum) = 1999-5-27");
?>
// $ dokument ve výstupu by měl obsahovat HTML dokument.
// Je nutné odstranit všechny HTML tagy, javascriptové sekce,
// mezery mezi znaky. Je také nutné některé vyměnit
// HTML entity na jejich ekvivalent.$ hledat = pole ( """si",
// Vystřihněte javaScript
""<[\/\!]*?[^<>] *?> "si", // Odstraní značky HTML
"" ([\ r \ n]) [\ s] + "", // Odstraní mezery
"" & (quot | # 34); "i", // Nahrazuje entity HTML
"" & (amp | # 38); "i",
"" & (lt | # 60); "i",
"" & (gt | # 62); "i",
"" & (nbsp | # 160); "i",
"" & (mimo | # 161); "i",
"" & (cent | # 162); "i",
"" & (libra | # 163); "i",
"" & (kopie | # 169); "i",
"" (\ d +); "e"); // interpretovat jako php kód$ nahradit = pole ("",
""
,
"\\1"
,
"\""
,
"&"
,
"<"
,
">"
,
" "
,
chr (161),
chr (162),
chr (163),
chr (169),
"chr (\\ 1)"); $ text = preg_replace ($ hledat, $ nahradit, $ dokument);
?>
Tabulky:
1 | LLC Hledat | Kudykino Pole 15/3
2 | Elita CJSC | Slunisvalinsk 133/7
3 | OJSC Pyshpysch | Soldatodachestroy 404
r_id | Typy oprav |
1 | Kladivo + hřebíky
2 | Poradenství pro krásu
3 | Generální oprava
l_id | Kdo | Co je potřeba | Čas | Komentář operátora
1 | 1 | 2 | % časové razítko% | % operator_text%
2 | 2 | 1 | | % text%
3 | 3 | 2 | | % text%
Tabulka 2 obsahuje seznam služeb.
Tabulka 3 obsahuje seznam aktuálních zakázek pro operační týmy. Tato tabulka je pravidelně aktualizována a k jejímu vyplnění slouží webový formulář. Vzhledem k tomu, že přichází poměrně málo objednávek, jsou do tabulky zapisovány záznamy ve formě ID klientů a služeb.
$ dotaz = "VYBRAT * ZE seznamu";
$ vysledek = mysql_query (dotaz $);
while ($ row = mysql_fetch_array ($ result. // vzít výsledky z každého řádku
(echo ""; // tisk dat
}
CREATE TABLE "název_tabulky" ("id" int (255) NOT NULL AUTO_INCREMENT, text "seznam" (80) NOT NULL, PRIMÁRNÍ KLÍČ ("id".
nejlepší odpověď
"
vybrat společnosti.Společnost, typy_oprav.Typy_oprav, seznam.komentář_l
ze seznamu
vnitřní společnosti
na seznamu.Kdo = společnosti.c_id
typy oprav vnitřního spojení
na seznamu. "Co je potřeba" = repair_types.r_id
";
V poslední době se diskuze o jazyce PHP na Habré omezily na možnosti navrhování složitých systémů, které se nemohou než radovat. Když jsem se však podíval na tucet nejuznávanějších webových frameworků (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ a další), byl jsem upřímně překvapen, když jsem našel některé významné nedostatky z hlediska elementární optimalizace.
Aby bylo toto téma více technicky zaměřené, jsou výsledky prezentovány rigoróznější formou, což může vnímání poněkud zkomplikovat.
Takže, jdeme na to... Úkol je extrémně jednoduchý: provést experimenty s rychlostí vytváření řetězců z podřetězců v jednoduchých a dvojitých uvozovkách. V zásadě bude tato otázka vzhledem ke zvláštnostem zpracování řetězců v PHP aktuální ještě dlouho.
Existuje mnoho článků o základní optimalizaci skriptů jak v ruštině, tak v jiných jazycích. Říká málo o řetězcích, ale upozorňuje na skutečnost, že se řetězce „analyzují“ ve dvojitých uvozovkách pro proměnné a řídicí znaky (jako v oficiální dokumentaci). Na základě toho je logické předpokládat, že používání řetězců v uvozovkách při práci bude poněkud pomalejší než stejné operace s podřetězci v jednoduchých uvozovkách.
Kromě substituce proměnných do řetězců a zřetězení proměnných s podřetězci implementuje PHP ještě minimálně jeden způsob tvoření řetězců: práci s funkcí sprintf. Je logické předpokládat, že tato metoda bude výrazně horší než ta "standardní" kvůli zbytečnému volání funkce a parsování řetězce uvnitř.
Jediný dodatek, než vám představím kód testovacího skriptu: musíte zvážit 2 možné možnosti práce s řetězci v uvozovkách: s přihlédnutím k jednoduchému a „pokročilému“ stylu kódování. Neměli byste věnovat pozornost skutečnosti, že proměnné jsou pravděpodobně na samém začátku řádků - jsou to jen příklady:
$ string = "$ _SERVER [" HTTP_HOST "] - ne správa oblasti Uljanovsk. Milujeme ruský jazyk a nemáme rádi ty, kteří jej používají ... "
a
$ string = "($ _SERVER [" HTTP_HOST "]) - ne správa oblasti Uljanovsk. Milujeme ruský jazyk a nemáme rádi ty, kteří jej používají ... "
Test číslo jedna.
No, zdá se, že všechny výhrady byly učiněny – je čas ukázat výsledky práce. Zdrojový kód testeru lze nalézt.
Screenshoty ukazují, že moje hypotéza se nepotvrdila. Jediný správný předpoklad se ukázal být o práci s řetězci přes sprintf. Nejrychlejší jsou funkce, které pracují s dvojitými uvozovkami.
Po krátkém zvážení situace přišlo vysvětlení samo: celá podstata spočívá v tom, že referenční řetězec, do kterého byly substituce provedeny, je příliš krátký: předávání analyzátoru po takovém řetězci je maličkost. I zde však můžete vidět, že nativní substituce proměnné v řetězci dává výhodu oproti „pokročilému stylu“.
To je také slabina přístupu zřetězení: objemy vložených dat převyšují objemy podřetězců. Odkud se režijní náklady berou, se dočtete v již zmíněných habratopicích.
I tyto myšlenky však musely být potvrzeny. To vyžadovalo druhý test se změnami z možných důvodů uvedených pro takové nepředvídatelné (pro mě) chování. Zdá se, že v páté verzi bylo hodně vyladěno (přiznám se, že v páté verzi php jsem provedl pouze 1 test: procházet prvky pole).
Test číslo dvě.
Druhá hypotéza: prodloužení referenčního řetězce nakonec zvýší procento doby běhu testovacích funkcí spojených s vytvářením řetězců ve dvojitých uvozovkách vzhledem k výsledkům testu 1. Stejná situace by teoreticky měla být pozorována s ohledem na provoz funkce sprintf. To je způsobeno především potřebou analyzovat řetězce a zvýšením času stráveného na tomto procesu. V situaci se zřetězením podřetězců v jednoduchých uvozovkách si myslím, že bude pozorován přibližně stejný výsledek jako v prvním testu, což způsobí mírné snížení zlomku doby provádění funkce quotes_3 () časem celý skript běží (ale ne zvýšení výkonu).
Závěry jsou ve skutečnosti pouze pozitivní a potvrzující hypotézu. S mírným zvýšením referenčního řetězce se objeví velké zatížení, což vede ke snížení výkonu funkcí pro práci s dvojitými uvozovkami a sprintf.
Předpoklad týkající se řetězců v jednoduchých uvozovkách se také ukázal jako správný: místo 36,75 % času v prvním testu zabrala funkce quotes_3 () ve druhém 33,76 % času provádění skriptu.
Praktická hodnota.
Jednoduše řečeno, abstrahujeme od dat, můžeme dojít k závěru: čím delší je řetězec, ve kterém je třeba provést substituci, tím je pravděpodobnější, že operace zřetězení bude provedena rychleji než hledání proměnné v uvozovkách. Dobrovolníci se mohou pokusit zvolit potřebné parametry vkládání (počet proměnných, délka referenčního řetězce, délka řetězců v proměnných) tak, aby vyhovovaly rovnosti časů provádění.
To je ve skutečnosti vše. Zbývá jen dodat, že v programování nejsou žádné maličkosti (to říkám těm, kteří rádi říkají „úspora na zápasy“ (c) Adelf). Když znáte takové jemnosti a vezmete je v úvahu, můžete napsat kód, který bude optimalizován na všech úrovních;)
PS:
Testy provedené pomocí Zend Studio For Eclipse 6.0.0 (včetně Debuggeru a Profileru).
PHP verze 5.2.5
OS Debian Linux
PPS:
Byl bych rád, kdyby někdo zveřejnil výsledky těchto testů. Myslím, že nám to umožní objektivněji posoudit nutnost použití té či oné metody substituce v řetězcích. Byl bych také vděčný za zdravou kritiku stylu prezentace a designu.