PHP zamjena varijabli u string. Korišćenje šablona u PHP-u

(PHP 4, PHP 5, PHP 7)

str_replace - Zamjenjuje sva pojavljivanja niza za pretraživanje zamjenskim nizom

Opis

Ova funkcija vraća string ili niz sa svim pojavljivanjima pretraživanja u predmetu zamijenjenim zamjenom.

Ako vam nisu potrebna složena pravila pretraživanja / zamjene (npr. regularni izrazi), ova funkcija je poželjna. preg_replace ().

Lista parametara

Ako su pretraga i zamjena nizovi, onda str_replace () koristi svaku vrijednost iz odgovarajućeg niza za pretraživanje i zamjenu u predmetu. Ako polje zamjene ima manje elemenata od pretraživanja, prazan niz će se koristiti kao zamjenski niz za preostale vrijednosti. Ako je pretraga niz, a zamijeni niz, onda će se ovaj zamjenski niz koristiti za svaki element u nizu pretraživanja. Suprotan slučaj nema smisla.

Ako su pretraga ili zamjena nizovi, njihovi elementi će se obraditi od prvog do posljednjeg.

Vrijednost koju treba tražiti, također poznata kao igla(igla). Za skup željenih vrijednosti možete koristiti niz.

Zamijenite

Vrijednost zamjene će se koristiti za zamjenu pretraživanja vrijednosti pretraživanja. Za više vrijednosti možete koristiti niz.

Predmet

Niz ili niz za pretraživanje i zamjenu, također poznat kao plast sijena(plast sijena).

Ako je predmet niz, tada će se izvršiti pretraga zamjene nad svakim elementom subjekta, a funkcija će također vratiti niz.

Ako je prošao, bit će postavljen na broj izvršenih zamjena.

Povratne vrijednosti

Ova funkcija vraća string ili niz sa zamijenjenim vrijednostima.

Primjeri

Primjer # 1 Primjeri upotrebe str_replace ()

// dodjeljuje
$ bodytag = str_replace ("% body%", "crno", " " );

// dodjeljuje: Hll Wrld f PHP
$ samoglasnici = niz ("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$ onlyconsonants = str_replace ($ samoglasnici, "", "Hello World of PHP");

// zadaje: Svaki dan treba jesti picu, pivo i sladoled
$fraza = "Trebali biste jesti voće, povrće i vlakna svaki dan.";
$ zdrav = niz ("voće", "povrće", "vlakna");
$ yummy = niz ("pica", "pivo", "sladoled");

$ newphrase = str_replace ($ zdrav, $ ukusan, $ fraza);

// dodjeljuje: 2
$ str = str_replace ("ll", "", "sjajno gospođice Moli!", $ count);
echo $ count;
?>

Primjer # 2 Primjeri potencijalnih trikova sa str_replace ()

// Zamjenski nalog
$ str = "Linija 1 \ n Linija 2 \ r Linija 3 \ r \ n Linija 4 \ n";
$ order = niz ("\ r \ n", "\ n", "\ r");
$ zamijeni = "
" ;

// Prvo obrađuje \ r \ n kako bi se izbjegla njihova ponovna zamjena.
echo $ newstr = str_replace ($ red, $ zamjena, $ str);

// Ispisuje F, jer A se zamjenjuje sa B, zatim B sa C, i tako dalje...
// Kao rezultat toga, E će biti zamijenjeno sa F, pošto je zamjena s lijeva na desno.
$ pretraga = niz ("A", "B", "C", "D", "E");
$ zamijeni = niz ("B", "C", "D", "E", "F");
$ predmet = "A";
echo str_replace ($ pretraga, $ zamjena, $ predmet);

// Izlazi: jabuka i orah (iz gore navedenog razloga)
$ slova = niz ("i", "o");
$ voće = niz ("jabuka", "oraščić");
$text = "Ja sam o";
$ output = str_replace ($ slova, $ voće, $ tekst);
echo $ izlaz;
?>

Bilješke (uredi)

Komentar: Ova funkcija je sigurna za obradu podataka u binarnom obliku.

Upozorenje

Napomena o zamjeni

Jer str_replace () vrši zamjenu s lijeva na desno, a onda kada se koristi više zamjena, može zamijeniti prethodno umetnutu vrijednost drugom. Pogledajte i primjere na ovoj stranici.

Komentar:

Ova funkcija je osjetljiva na velika i mala slova. Koristi str_replace () za zamjenu bez obzira na velika i mala slova.

Komentar: PHP 7.0.0 na 64-bitnim platformama nema nikakva dostižna ograničenja dužine niza, na 32-bitnim sistemima i ranije PHP verzije, redovi ne mogu biti veći od 2 GB (2147483647 bajtova).

Sintaksa

Niz se može specificirati sa četiri Različiti putevi:

  • jednostruki navodnici
  • dvostruki navodnici
  • nowdoc sintaksa (od PHP 5.3.0)

Jednostruki navodnici

Najjednostavniji način definirati niz znači staviti ga u jednostruke navodnike (the " ).

Da biste koristili jedan navodnik unutar niza, izmaknite ga obrnutom kosom crtom ( \ ). Ako trebate napisati samu obrnutu kosu crtu, duplirajte je ( \\ ). Sve druge upotrebe obrnute kose crte će se tumačiti kao normalni znakovi, što znači da ako pokušate koristiti druge izlazne sekvence kao što je \ r ili \ n, oni će biti prikazani onakvi kakvi jesu umjesto bilo kakvog posebnog ponašanja.

echo "ovo je jednostavan niz";

echo „Možete i umetnuti u redove
karakter za novi red ovako,
ovo je normalno"
;

// Izlazi: Arnold je jednom rekao "ja" ću se vratiti "
echo "Arnold je jednom rekao: "Vratiću se";

Echo "Jeste li uklonili C: \\ *. *?";

// Izlazi: Jeste li uklonili C: \ *. *?
echo "Jeste li uklonili C: \ *. *?" ;

// Izlazi: Ovo neće biti prošireno: \ n novi red
echo "Ovo neće biti prošireno: \ n novi red";

// Izlazi: Varijable $ proširiti također $ ili nisu proširene
echo "Varijable $ proširiti također ne $ proširiti";
?>

Dvostruki navodnici

Ako je niz stavljen u dvostruke navodnike ("), PHP prepoznaje sljedeće izlazne sekvence za specijalne znakove:

Escape sekvence
Sequence Značenje
\ n novi red (LF ili 0x0A (10) u ASCII)
\ r povratak na nosivu (CR ili 0x0D (13) u ASCII)
\ t horizontalna kartica (HT ili 0x09 (9) u ASCII)
\ v vertikalna kartica (VT ili 0x0B (11) u ASCII) (od PHP 5.2.5)
\ e escape znak (ESC ili 0x1B (27) u ASCII) (od PHP 5.4.4)
\ f feed stranice (FF ili 0x0C (12) u ASCII) (od PHP 5.2.5)
\\ obrnuta kosa crta
\$ znak dolara
\" dvostruki citat
\{1,3} niz znakova koji odgovara znaku regularnog izraza u oktalnom obliku koji se tiho prelijeva kako bi se uklopio u bajt (tj. "\ 400" === "\ 000")
\ x (1,2) niz znakova koji odgovara znaku regularnog izraza u heksadecimalnom zapisu
\ u (+) niz znakova koji se poklapaju sa regexom Unicode znakova koji se preslikava u niz u UTF-8 notaciji (dodato u PHP 7.0.0)

Kao i kod stringa zatvorenog u jednostruke navodnike, izbjegavanje bilo kojeg znaka će također dati sam izlazni znak. Prije PHP 5.1.1, obrnuta kosa crta u \ ($ var) nije štampano.

Heredoc

Treći način definiranja stringova je korištenje heredoc sintakse: <<< ... Nakon ovog operatora, morate navesti identifikator, a zatim prijelaz na red. Nakon toga dolazi sama linija, a zatim isti identifikator koji zatvara umetak.

Linija trebalo bi početi sa završnim identifikatorom, tj. mora biti u prvoj koloni reda. Osim toga, identifikator mora slijediti ista pravila imenovanja kao i sve druge oznake u PHP-u: sadržavati samo alfanumeričke znakove i donju crtu i ne smije početi brojem (donje crte su dozvoljene).

Pažnja

Vrlo je važno napomenuti da red sa završnim identifikatorom ne smije sadržavati nikakve druge znakove, osim točke i zareze ( ; ). To znači da identifikator ne smije biti uvučen i da ne smije biti razmaka ili tabulatora prije ili iza tačke i zareza. Također je važno razumjeti da prvi znak prije završnog identifikatora mora biti znak novog reda kako je definirao vaš operativni sistem. Na primjer, na UNIX sistemima, uključujući macOS, ovo je \ n... Novi red također mora početi odmah nakon završnog identifikatora.

Ako je ovo pravilo prekršeno i identifikator zatvaranja nije "čist", smatra se da nedostaje i PHP će nastaviti dalje tražiti ga. Ako u ovom slučaju ispravan identifikator zatvaranja i dalje nije pronađen, to će uzrokovati grešku raščlanjivanja s brojem reda na kraju skripte.

Primjer # 1 Primjer netočne sintakse

klasa foo (
javni $ bar =<<bar
EOT;
// uvlačenje ispred identifikatora zatvaranja nije dozvoljeno
}
?>

Primjer # 2 Primjer ispravne sintakse

klasa foo (
javni $ bar =<<bar
EOT;
}
?>

Heredoc se ne može koristiti za inicijalizaciju polja klase. Od PHP 5.3, ovo ograničenje se odnosi samo na heredocs koji sadrže varijable.

Heredoc tekst se ponaša isto kao string sa dvostrukim navodnicima bez njih. To znači da ne morate izbjegavati navodnike u heredoc, ali i dalje možete koristiti gornje izlazne sekvence. Varijable se obrađuju, ali kada koristite složene varijable unutar heredoc-a, morate biti oprezni kao kada radite sa stringovima.

Primjer #3 Primjer definiranja heredoc stringa

$ str =<<Primjer linija,
prostiru se na više linija,
koristeći heredoc sintaksu.
EOD;

Class foo
{
var $ foo;
var $ bar;

Funkcija __construct ()
{
$ this -> foo = "Foo";
$ ovo ->
}
}

$ foo = novi foo ();
$ name = "Ime";

echo<<Moje ime je "$ name". Upisujem $ foo -> foo .
Sada iznosim
($ foo -> bar [1]) .
Ovo bi trebalo dati veliko "A": \ x41
EOT;
?>

Moje ime je "Imarek". Upisujem Foo. Sada prikazujem Bar2. Ovo bi trebalo dati veliko "A": A

Također je moguće koristiti heredoc sintaksu za prosljeđivanje podataka kroz argumente funkcije:

Počevši od verzije 5.3.0, postalo je moguće inicijalizirati statičke varijable i svojstva/konstante klase koristeći heredoc sintaksu:

Primjer # 5 Korišćenje heredoc za inicijalizaciju statičkih varijabli

// Statičke varijable
funkcija foo ()
{
statički $ bar =<<Ovde nema nista...
LABEL;
}

// Konstante klase / svojstva
class foo
{
const BAR =<<Primjer korištenja konstante
FOOBAR;

Javni $ baz =<<Primjer korištenja polja
FOOBAR;
}
?>

Od PHP 5.3.0, Heredoc identifikator možete okružiti i dvostrukim navodnicima:

Nowdoc

Nowdoc je isti za stringove sa jednostrukim navodnicima kao heredoc za nizove sa dvostrukim navodnicima. Nowdoc je kao heredoc, ali unutar njega ne vrše se zamjene... Ova konstrukcija je idealna za ugrađivanje PHP koda ili drugih velikih blokova teksta bez potrebe za izbjegavanjem. U ovom slučaju to je pomalo nalik SGML konstrukciji. deklarisanjem bloka teksta da se ne obrađuje.

Nowdoc je označen istim nizom <<< , koji se koristi u heredoc, ali je identifikator koji ga slijedi zatvoren u jednostrukim navodnicima, na primjer, <<<"EOT" ... Svi uslovi koji se primjenjuju na heredoc identifikatore također se odnose na nowdoc, posebno oni koji se odnose na završni identifikator.

Primjer # 7 Primjer korištenja nowdoc

echo<<<"EOD"
Primjer teksta,
prostiru se na više linija,
koristeći sintaksu nowdoc. Obrnute kose crte se uvijek tretiraju doslovno,
na primjer, \\ i \ ".
EOD;

Rezultat ovog primjera:

Uzorak teksta koji se proteže u više redova koristeći sintaksu nowdoc. Obrnute kose crte se uvijek tretiraju doslovno, na primjer, \\ i \ ".

Primjer #8 Nowdoc primjer navođenja stringova s ​​varijablama

/ * Složeniji primjer sa varijablama. * /
class foo
{
public $ foo;
javni $ bar;

Funkcija __construct ()
{
$ this -> foo = "Foo";
$ this -> bar = niz ("Bar1", "Bar2", "Bar3");
}
}

$ foo = novi foo ();
$ name = "Ime";

echo<<<"EOT"
Moje ime je "$ name". Upisujem $ foo-> foo.
Sada kucam ($ foo-> bar).
Ovo ne bi trebalo da štampa veliko "A": \ x41
EOT;
?>

Rezultat ovog primjera:

Moje ime je "$ name". Upisujem $ foo-> foo. Sada kucam ($ foo-> bar). Ovo ne bi trebalo da štampa veliko "A": \ x41

Primjer #9 Primjer korištenja statičkih podataka

klasa foo (
javni $ bar =<<<"EOT"
bar
EOT;
}
?>

Komentar:

Nowdoc podrška je dodana u PHP 5.3.0.

Varijabilno rukovanje

Ako je niz naveden u dvostrukim navodnicima ili koristeći heredoc, varijable unutar njega se obrađuju.

Postoje dvije vrste sintakse: jednostavna i složena. Jednostavna sintaksa je lakša i praktičnija. Omogućava obradu varijable, vrijednosti niza ( niz) ili svojstva objekta ( objekt) uz minimum napora.

Složena sintaksa se može prepoznati po vitičastim zagradama koje okružuju izraz.

Jednostavna sintaksa

Ako prevodilac naiđe na znak dolara ( $ ), uzima što je moguće više znakova kako bi formirao ispravno ime varijable. Ako želite precizno definirati kraj imena, stavite ime varijable u vitičaste zagrade.

$ juice = "jabuka";

echo "Popio je sok od $ juice." ... PHP_EOL;

// Netočno. "s" je važeći znak za ime varijable, ali varijabla se zove $ juice.
echo "Popio je sok od $ sokova." ;

// Ispravno. Kraj imena varijable je striktno specificiran korištenjem zagrada:
echo "Popio je sok napravljen od $ (soka) s." ;
?>

Rezultat ovog primjera:

Popio je sok od jabuke. Popio je sok od. Popio je sok od jabuke.

Element niza ( niz) ili svojstvo objekta ( objekt). U indeksima niza, zatvarajuća uglata zagrada ( ] ) označava kraj definicije indeksa. Za svojstva objekta vrijede ista pravila kao i za jednostavne varijable.

Primjer # 10 Jednostavan primjer sintakse

define ("KOOLAID", "koolaid1");
$ juices = niz ("jabuka", "narandža", "koolaid1" => "ljubičasta");

echo "Popio je nekoliko $ sokova [0] soka." ... PHP_EOL;
echo "Popio je nekoliko $ sokova [1] soka." ... PHP_EOL;
echo "Popio je nekoliko $ sokova [koolaid1] soka." ... PHP_EOL;

klasni ljudi (
public $ john = "John Smith";
public $ jane = "Jane Smith";
public $ robert = "Robert Paulsen";

Public $ smith = "Smith";
}

$ ljudi = novi ljudi ();

echo "$ ljudi -> John je popio malo $ sokova [0] soka." ... PHP_EOL;
echo "$ ljudi -> john je zatim pozdravio $ljudi -> jane." ... PHP_EOL;
echo "$ ljudi -> johnova žena je pozdravila $ljudi -> robert. ". PHP_EOL;
echo "$ ljudi -> Robert je pozdravio dvoje $ ljudi -> smiths." ; // Neće raditi
?>

Rezultat ovog primjera:

Popio je sok od jabuke. Popio je sok od narandže. Popio je ljubičasti sok. John Smith je popio sok od jabuke. John Smith je zatim pozdravio Jane Smith. Žena Johna Smitha je pozdravila Roberta Paulsena. Robert Paulsen je pozdravio njih dvoje.

PHP 7.1.0 dodaje podršku za negativan numerički indeksi.

Primjer # 11 Negativni numerički indeksi

$ string = "string";
echo "Znak sa indeksom -2 je$ string [- 2]. ", PHP_EOL;
$ string [- 3] = "o";
echo "Promjena znaka na poziciji -3 u" o "daje sljedeći red:$ string. ", PHP_EOL;
?>

Rezultat ovog primjera:

Znak sa indeksom -2 je n. Promjena karaktera na poziciji -3 u "o" daje sljedeći red: jak

Za sve složenije, koristite složenu sintaksu.

Složena (kovrdžava) sintaksa

Naziva se teškim ne zato što ga je teško razumjeti, već zato što dozvoljava upotrebu složenih izraza.

Bilo koja skalarna varijabla, element niza ili svojstvo objekta mapirano u string može biti predstavljeno u nizu ovom sintaksom. Samo napišite izraz na isti način kao izvan reda, a zatim ga uključite { i } ... Ukoliko { ne može se izbjeći, ova sintaksa će biti prepoznata samo kada $ slijedi odmah nakon toga { ... Koristi {\$ isprintati {$ ... Nekoliko ilustrativnih primjera:

// Prikaži sve greške
error_reporting (E_ALL);

$ odlično = "odlično";

// Ne radi, izlazi: Ovo je (odlično)
echo "Ovo je ($ super)";

// Radi, izlazi: Ovo je sjajno
echo "Ovo je ($ super)";

// Working
echo „Ovaj trg je širok($ kvadrat -> širina) 00 centimetara. ";

// Radi, ključevi pod navodnicima rade samo sa sintaksom vitičastih zagrada
echo "Ovo radi: ($ arr [" ključ "])";

// Working
echo "Ovo radi: ($ arr [4] [3])";

// Ovo je netačno iz istog razloga kao i $ foo izvana
// strings. Drugim riječima, i dalje će raditi.
// ali pošto PHP prvo traži konstantu foo, ovo će pozvati
// Greška nivoa E_NOTICE (nedefinirana konstanta).
echo „Nije u redu:($ arr [foo] [3]) ";

// Working. Kada se interno koriste višedimenzionalni nizovi
// stringovi uvijek koriste vitičaste zagrade
echo "Ovo radi: ($ arr [" foo "] [3])";

// Working.
echo "Ovo radi:". $ arr ["foo"] [3];

echo "I ovo radi:($ obj -> vrijednosti [3] -> ime) ";

echo „Ovo je vrijednost varijable po imenu$name: ($ ($name)) ";

echo "Ovo je vrijednost varijable po imenu koju funkcija getName () vraća:($ (getName ())) ";

echo "Ovo je vrijednost varijable po imenu koju \ $ object-> getName () vraća:($ ($ objekt -> getName ())) ";

// Ne radi, izlazi: Ovo je ono što getName () vraća: (getName ())
echo "Ovo je ono što getName () vraća: (getName ())";
?>

Koristeći ovu sintaksu, također je moguće pristupiti svojstvima objekta unutar stringova.

klasa foo (
var $ bar = "Ja sam bar." ;
}

$ foo = novi foo ();
$ bar = "bar";
$ baz = niz ("foo", "bar", "baz", "quux");
echo "($ foo -> $ bar) \ n";
echo "($ foo -> ($ baz [1])) \ n";
?>

Rezultat ovog primjera:

Ja sam bar. Ja sam bar.

Komentar:

Funkcije, pozivi metoda, statičke varijable klase i konstante klase rade interno {$} od PHP 5. Međutim, navedena vrijednost će se tretirati kao ime varijable u istom kontekstu kao i string u kojem je definirana. Korištenje pojedinačnih vitičastih zagrada ( {} ) neće raditi za pristup vrijednostima funkcija, metoda, konstanti klase ili statičkih varijabli klase.

// Prikaži sve greške
error_reporting (E_ALL);

klasa piva (
const softdrink = "rootbeer";
public static $ ale = "ipa";
}

$ rootbeer = "A & W";
$ ipa = "Aleksandar Keith \" s ";

// Ovo radi, izlazi: Želio bih A & W
echo "Želio bih ($ (piva :: bezalkoholno piće)) \ n";

// Ovo također radi, izlazi: Volio bih Alexander Keith "s
echo "Želio bih ($ (piva :: $ ale)) \ n";
?>

Pristup i izmjena karaktera u nizu

Znakovi u nizovima se mogu koristiti i modificirati definiranjem njihovog pomaka od početka stringa, počevši od nule, u uglastim zagradama nakon niza, na primjer, $ str. Za ovu svrhu zamislite string kao niz znakova. Ako trebate dobiti ili zamijeniti više od 1 znaka, možete koristiti funkcije substr () i substr_replace ().

Komentar: budući da su podržane negativne vrijednosti pomaka PHP 7.1.0. Oni postavljaju pomak od kraja linije. Prethodno negativni pomaci uzrokovali su grešku nivoa E_NOTICE tokom čitanja (vraćanje praznog niza). E_UPOZORENJE dok pišete (ostavljajući red nepromijenjenim).

Komentar: Znak u nizu se također može referencirati pomoću vitičastih zagrada, na primjer, $ str (42).

Pažnja

Pokušaj pisanja u off-line pomak će ispuniti red razmacima do tog pomaka. Necijeli tipovi će biti konvertovani u cele brojeve. Pogrešan tip pomaka će uzrokovati grešku nivoa E_UPOZORENJE... Koristi se samo prvi znak dodijeljenog niza. Od PHP 7.1.0, dodeljivanje praznog niza će izazvati fatalnu grešku. Ranije je u ovom slučaju dodijeljen NULL bajt.

Pažnja

Stringovi u PHP-u su interni nizovi bajtova. Kao rezultat toga, pristup ili modifikacija stringa na pomaku nije bezbedno sa stanovišta višebajtnog kodiranja i trebalo bi da se izvodi samo sa nizovima u jednobajtnim kodovima kao što je ISO-8859-1.

Komentar: Počevši od PHP 7.1.0, korištenje praznog indeksa uzrokuje fatalnu grešku, ranije, u sličnom slučaju, niz je konvertovan u niz bez upozorenja.

Primjer # 12 Neki primjeri stringova

// Dobivamo prvi znak niza
$ str = "Ovo je test." ;
$ prvi = $ str [0];

// Dobivamo treći znak niza
$ treći = $ str [2];

// Dobivamo posljednji znak niza
$ str = "Ovo je još uvijek test." ;
$ last = $ str [strlen ($ str) - 1];

// Promjena posljednjeg znaka reda
$ str = "Pogled na more";
$ str [strlen ($ str) - 1] = "e";

?>

Od PHP 5.4, pomak u nizu mora biti specificiran ili kao cijeli broj ili kao niz koji sadrži brojeve, inače će biti izdato upozorenje. Prethodno je pomak specificiran linijom obrasca "foo", bez upozorenja pretvoren u 0 .

Primjer # 13 Razlike između PHP 5.3 i 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"]));
?>

Rezultat pokretanja ovog primjera u PHP 5.3:

string (1) "b" bool (tačno) string (1) "b" bool (tačno) string (1) "a" bool (tačno) string (1) "b" bool (tačno)

Rezultat pokretanja ovog primjera u PHP 5.4:

string (1) "b" bool (true) Upozorenje: Ilegalni pomak niza "1.0" u /tmp/t.php na liniji 7 string (1) "b" bool (false) Upozorenje: Ilegalni pomak niza "x" u / tmp / t.php na liniji 9 string (1) "a" bool (false) string (1) "b" bool (false)

Komentar:

Pokušaj pristupa varijablama drugih tipova (isključujući nizove ili objekte koji implementiraju određena sučelja) koristeći ili {} ćutke vratiti NULL.

Komentar:

PHP 5.5 je dodao podršku za pristup znakovima u literalima niza koristeći sintaksu ili {} .

Postoje mnoge korisne funkcije za modificiranje nizova.

Osnovne funkcije su opisane u odjeljku o funkcijama stringova, a za napredno pretraživanje i zamjenu, funkcije regularnih izraza kompatibilnih s Perl-om.

Pretvaranje u string

Vrijednost se može pretvoriti u string pomoću cast (niz), ili funkcije strval ()... U izrazima gdje je potreban niz, konverzija se događa automatski. Ovo se dešava kada koristite funkcije echo ili print, ili kada se vrijednost varijable uporedi sa nizom. Čitajući odeljke o tipovima i tipovima u priručniku, sledeće će biti jasnije. vidi takođe settype ().

Nizovi se uvijek pretvaraju u string "niz" tako da ne možete prikazati sadržaj niza ( niz) koristeći echo ili print da vidite šta sadrži. Da vidite pojedinačnu stavku, koristite nešto poput echo $ arr ["foo"]... U nastavku pogledajte savjete o tome kako prikazati/pogledati sav sadržaj.

Za pretvaranje varijable u tip "Objekat" u tipu string koristi se magična metoda __toString.

Značenje NULL uvijek se pretvara u prazan string.

Kao što možete vidjeti gore, direktna konverzija u niz nizova, objekata ili resursa ne pruža nikakve korisne informacije o samim vrijednostima, osim o njihovim tipovima. Bolji način za izlaz vrijednosti za otklanjanje grešaka je korištenje funkcija print_r () i var_dump ().

Većina vrijednosti u PHP-u može se pretvoriti u string za trajno skladištenje. Ova metoda se naziva serijalizacija i može se izvršiti pomoću funkcije serijalizirati ().

Pretvaranje nizova u brojeve

Ako je niz prepoznat kao numerička vrijednost, rezultirajuća vrijednost i tip se određuju kao što je prikazano u nastavku.

Ako niz ne sadrži nijedan od znakova ".", "E" ili "E", a vrijednost broja se nalazi unutar raspona cijelih brojeva (definiranih PHP_INT_MAX), niz će biti prepoznat kao cijeli broj ( cijeli broj). U svim ostalim slučajevima, smatra se brojem s pomičnim zarezom ( float).

Vrijednost je određena početkom niza. Ako niz počinje važećom numeričkom vrijednošću, koristit će se ta vrijednost. U suprotnom, vrijednost će biti 0 (nula). Važeća numerička vrijednost je jedna ili više cifara (koje mogu sadržavati decimalni zarez), opcionalno prethodi znak nakon kojeg slijedi opcijski eksponent. Eksponent je "e" ili "E" iza kojeg slijedi jedna ili više cifara.

$ foo = 1 + "10.5"; // $ foo je float (11.5)
$ foo = 1 + "-1.3e3"; // $ foo je float (-1299)
$ foo = 1 + "bob-1.3e3"; // $ foo je cijeli broj (1)
$ foo = 1 + "bob3"; // $ foo je cijeli broj (1)
$ foo = 1 + "10 malih svinja"; // $ foo je cijeli broj (11)
$ foo = 4 + "10.2 mala praseta"; // $ foo je float (14.2)
$ foo = "10.0 svinja" + 1; // $ foo je float (11)
$ foo = "10,0 svinja" + 1,0; // $ foo je float (11)
?>

Za više informacija o ovoj konverziji, pogledajte strtod (3) odjeljak Unix dokumentacije.

Ako želite da testirate bilo koji od primjera u ovom odjeljku, kopirajte ga i zalijepite i sljedeći red da vidite šta se događa:

echo "\ $ foo == $ foo; tip:". gettype ($ foo). "
\ n ";
?>

Ne očekujte da ćete dobiti kod znakova pretvaranjem u cijeli broj (kao što se radi, na primjer, u C). Za pretvaranje znakova u njihove ASCII kodove i obrnuto, koristite funkcije red () i chr ().

Detalji implementacije tipa niza

prije 7 godina

U dokumentaciji se ne spominje, ali se završna tačka-zarez na kraju heredoc-a zapravo tumači kao prava tačka-zarez, i kao takva ponekad dovodi do sintaksičkih grešaka.

$ foo =<<a b c d
END;
?>

ovo ne znači:

foo (<<a b c d
END;
);
// sintaksička greška, neočekivano ";"
?>

Bez tačke sa zarezom, radi dobro:

foo (<<a b c d
KRAJ
);
?>

prije 3 godine

Možete koristiti niz znakova poput stringa (kao C)

$ a = "Test niza nizova";

var_dump ($ a);
// Povratni niz (17) "Test niza nizova"

var_dump ($ a);
// Povratni niz (1) "S"

// - Sa ubacivanjem niza -
var_dump ((niz) $ a);
// Povratak niz (1) (=> string (17) "Test niza nizova")

var_dump ((niz) $ a);
// Povratni niz (17) "S"

Norihiori

prije 15 godina

Možete koristiti složenu sintaksu da stavite vrijednost i osobina objekta I metoda objekta unutar stringa. Na primjer ...
razredni test (
javni $ jedan = 1;
javna funkcija dva () (
povratak 2;
}
}
$ test = novi test ();
echo "foo ($ test -> jedan) bar ($ test -> dva ())";
?>
Izdat će "foo 1 bar 2".

Međutim, to ne možete učiniti za sve vrijednosti u vašem imenskom prostoru. Konstante klase i statička svojstva/metode neće raditi jer složena sintaksa traži "$".
razredni test (
const ONE = 1;
}
echo "foo (Test :: ONE) bar";
?>
Ovo će dati "foo (Test :: jedan) bar". Konstante i statička svojstva zahtijevaju da razbijete niz.

prije 3 godine

Pazite da je u skladu s "pretvorbom nizova u brojeve":

Ako ("123abc" == 123) eho "(intstr == int) neispravno testira kao istinit.";

// Budući da je jedna strana broj, string je pogrešno konvertovan iz intstr u int, koji se onda poklapa sa testnim brojem.

// Tačno za sve uslovne izraze kao što su if i switch izjave (vjerovatno i while petlje)!

// Ovo bi mogao biti veliki sigurnosni rizik prilikom testiranja / korištenja / spremanja korisničkog unosa, dok se očekuje i testira samo cijeli broj.

// Čini se da je jedino rješenje da 123 bude niz kao "123" tako da se konverzija ne dogodi.

?>

prije 6 godina

Vodeće nule u nizovima se (najmanje iznenađenje) ne tretiraju kao oktalne.
Uzmite u obzir:
$ x = "0123" + 0;
$ y = 0123 + 0;
echo "x je $ x, y je $ y"; // ispisuje "x je 123, y je 83"
drugim riječima:
* vodeće nule u numeričkim literalima u izvornom kodu se tumače kao "oktalne", c.f. strtol ().
* vodeće nule u stringovima (npr. podaci koje je dostavio korisnik), kada su prebačeni (implicitno ili eksplicitno) na cijeli broj se zanemaruju i smatraju decimalnim, c.f. strtod ().

prije 10 godina

Evo jednostavnog haka koji omogućava da stringovi sa dvostrukim navodnicima i heredocs sadrže proizvoljne izraze u sintaksi vitičastih zagrada, uključujući konstante i druge pozive funkcija:

// Hack deklaracija
funkcija _expr ($ v) (povratak $ v;)
$ _expr = "_expr";

// Naše igralište
definirati ("qwe" , "asd");
definisati("zxc", 5 );

$ a= 3 ;
$ b= 4 ;

funkcija c($ a, $ b) (povratak$ a+ $ b; }

// Upotreba
echo"pre{ $ _expr(1 + 2 )} objava \ n "; // izlazi "pre 3 post"
echo"pre{ $ _expr(qwe)} objava \ n "; // izlazi "pre asd post"
echo"pre{ $ _expr(c($ a, $ b)+ zxc* 2 )} objava \ n "; // izlazi "pre 17 post"

// Opća sintaksa je ($ _expr (...))
?>

Prije 2 godine

Mislio sam da bi bilo korisno dodati ovaj komentar kako bi se informacije barem pojavile na pravoj stranici PHP stranice.

Imajte na umu da ako namjeravate koristiti niz s dvostrukim navodnicima s asocijativnim ključem, možete naići na grešku T_ENCAPSED_AND_WHITESPACE. Neki ovo smatraju jednom od manje očiglednih poruka o grešci.

Izraz kao što je:

$ voće= niz (
"a"=> "jabuka",
"b"=> "banana",
// itd
);

Print "Ovo je$ voće[ "a"] "; // T_ENCAPSED_AND_WHITESPACE
?>

sigurno će se raspasti.

Možete ga riješiti na sljedeći način:

print"Ovo je$ voće[ a] " ; // poništiti citat ključa
print"Ovo je${ voće[ "a"]} " ; // Složena sintaksa
print"Ovo je{ $ voće[ "a"]} " ; // Varijacija složene sintakse
?>

Lično preferiram posljednju varijaciju jer je prirodnija i bliža tome kakav bi izraz bio izvan stringa.

Nije jasno (bar meni) zašto PHP pogrešno tumači pojedinačni navodnik unutar izraza, ali pretpostavljam da to ima neke veze sa činjenicom da navodnici nisu dio niza vrijednosti - kada se string već raščlani, samo navodnici smetati ...?

Prije 2 godine

I jedno i drugo bi trebalo da radi :(

klasaTestiranje{
javna statičnost
$ VAR= "statičan";
public const VAR =
"konst";

Javna funkcija sayHelloStatic() {
echo
"zdravo:{ $ ovo:: $ VAR} " ;
}

Javna funkcija sayHelloConst() {
echo
"zdravo:{ $ ovo:: VAR)" ; // Greška raščlanjivanja: sintaksička greška, neočekivano ")", očekuje se "["
}
}

$ obj= novoTestiranje();
$ obj-> sayHelloStatic();
$ obj-> sayHelloConst();

prije 3 godine

Nešto što sam doživio što će bez sumnje nekome pomoći. ... ...
U mom uređivaču, ovo će sintaksom istaknuti HTML i $ komentar:

$ html =<<<"EOD"
$ comment
EOD;

Koristeći ovo pokazuje sve iste boje:

$ html =<<$ comment
EOD;

čini rad sa njim mnogo lakšim

prije 11 godina

Da biste sačuvali pamet, nemojte čitati prethodne komentare o datumima;)

Kada se oba niza mogu konvertovati u numeričke (u ("$ a"> "$ b") testu), tada se koriste dobijeni brojevi, u suprotnom se PUNI nizovi upoređuju char-by-char:

var_dump("1.22" > "01.23" ); // bool (lažno)
var_dump("1.22.00" > "01.23.00" ); // bool (tačno)
var_dump("1-22-00" > "01-23-00" ); // bool (tačno)
var_dump((plutati)"1.22.00" > (plutati)"01.23.00" ); // bool (lažno)
?>

mješovito preg_replace(mješoviti uzorak, mješovita zamjena, mješoviti predmet [, int limit])

Pretražuje predmet za podudaranje uzoraka i zamjenjuje ih zamjenom. Ako je parametar limita specificiran, tada će se granična pojavljivanja šablona zamijeniti; ako je ograničenje izostavljeno ili jednako -1, sva pojavljivanja obrasca će biti zamijenjena.

Zamjena može sadržavati reference u obliku \\ n ili (od PHP 4.0.4) $ n, s tim da je ovo drugo poželjnije. Svaka takva referenca će biti zamijenjena podnizom koji odgovara n "n" poduzorku zatvorenom u zagrade. N može imati vrijednosti od 0 do 99, a referenca \\ 0 (ili $ 0) odgovara cijelom uzorku. Poduzorci su numerisan s lijeva na desno, počevši od jedan...

Kada koristite zamjenu zamjenskih znakova korištenjem referenci na poduzorak, može biti moguće da broj odmah slijedi masku. U ovom slučaju, notacija \\ n rezultira greškom: referenca na prvi poduzorak praćena brojem 1 biće napisana kao \\ 11, što će se tumačiti kao referenca na jedanaesti poduzorak. Ova zabuna se može razjasniti upotrebom \ $ (1) 1 konstrukcije, koja ukazuje na izolovanu referencu na prvi poduzorak iza koje slijedi cifra 1.

Izlaz ovog primjera će biti:

1. april 2003

Ako se pronađe podudaranje uzorka tokom izvršavanja funkcije, izmijenjena vrijednost subjekta će biti vraćena, u suprotnom će biti vraćen originalni subjekt.

Prva tri parametra funkcije preg_replace () mogu biti jednodimenzionalni nizovi. Ako niz koristi ključeve, prilikom obrade niza, oni će biti uzeti u redoslijedu kojim se nalaze u nizu. Tasteri niza za uzorak i zamjenu su opcioni. Ako se ipak odlučite za korištenje indeksa, za podudaranje uzoraka i nizova uključenih u zamjenu, koristite funkciju ksort () za svaki od nizova.


Primjer 2. Korištenje nizova s ​​numeričkim indeksima kao argumenata funkcije preg_replace ()

$ string = "Brza smeđa lisica je preskočila lijenog psa."$ uzorci [0] = "/ brzo /";
$ uzorci [1] = "/smeđi /";
$ uzorci [2] = "/ lisica /"; $ zamjene [2] = "medvjed";
$ zamjene [1] = "crno";
$ replacements [0] = "sporo"; preg_replace ($ obrasci, $ zamjene, $ string);
?>

rezultat:

rezultat:

Spori crni medvjed je preskočio lijenog psa.

Ako je parametar subjekta niz, za svaki od njegovih elemenata se vrši pretraga i zamjena zamjenskih znakova. Vraćeni rezultat će također biti niz.

U slučaju da su uzorak parametara i zamjena nizovi, preg_replace () naizmjenično preuzima par elemenata iz oba niza i koristi ih za operaciju pretraživanja i zamjene. Ako zamjenski niz sadrži više elemenata od uzorka, uzet će se prazni nizovi umjesto elemenata koji nedostaju za zamjenu. Ako je obrazac niz, a zamjena niz, svaki element niza uzoraka će biti tražen i zamijenjen uzorkom (obrazac će naizmenično biti svi elementi niza, dok zamjenski niz ostaje fiksiran). Varijanta kada je obrazac niz, a zamjena niz nema smisla.

Modifikator / e mijenja ponašanje funkcije preg_replace () na način da se parametar zamjene, nakon izvođenja potrebnih zamjena, tumači kao PHP kod i tek onda se koristi za zamjenu. Kada koristite ovaj modifikator, budite oprezni: parametar zamjene mora sadržavati ispravan PHP kod, inače u redu koji sadrži poziv funkcije preg_replace (), dolazi do sintaksičke greške.


Primjer 3. Zamjena sa nekoliko šablona

$ uzorci = niz ( "/ (19 | 20) (\ d (2)) - (\ d (1,2)) - (\ d (1,2)) /",
"/ ^ \ s * ((\ w +)) \ s * = /");
$ zamijeni = niz ("\\ 3 / \\ 4 / \\ 1 \\ 2", "$ \\ 1 =");
echo preg_replace ($ patterns, $ replace, "(startDate) = 1999-5-27");
?>

Ovaj primjer će ispisati:

Konvertuje sve HTML oznake u velika slova


Primjer 5. Konverter HTML u tekst

// $ dokument u izlazu bi trebao sadržavati HTML dokument.
// Potrebno je ukloniti sve HTML oznake, javascript sekcije,
// razmaci. Također je potrebno neke zamijeniti
// HTML entitete na njihov ekvivalent.
$ pretraga = niz ( ""]*?>.*?"si", // Izreži javaScript
""<[\/\!]*?[^<>] *?> "si", // Uklanja HTML oznake
"" ([\ r \ n]) [\ s] + "", // Uklanja razmake
"" & (quot | # 34); "i", // Zamjenjuje HTML entitete
"" & (amp | # 38); "i",
"" & (lt | # 60); "i",
"" & (gt | # 62); "i",
"" & (nbsp | # 160); "i",
"" & (iexcl | # 161); "i",
"" & (cent | # 162); "i",
"" & (funta | # 163); "i",
"" & (kopija | # 169); "i",
"" (\ d +); "e"); // interpretirati kao php kod$ zamijeni = niz ("",
"" ,
"\\1" ,
"\"" ,
"&" ,
"<" ,
">" ,
" " ,
chr (161),
chr (162),
chr (163),
chr (169),
"chr (\\ 1)"); $ text = preg_replace ($ pretraga, $ zamjena, $ dokument);
?>



stolovi:

C_id | Kompanija | Lokacija
1 | LLC Pretraga | Kudykino Pole 15/3
2 | Elita CJSC | Slunisvalinsk 133/7
3 | OJSC Pyshpysch | Soldatodachestroy 404

Vrsta popravka (vrste_popravka)
r_id | Vrste_popravka |
1 | Čekić + ekseri
2 | Smjernice za ljepotu
3 | Remont

Spisak narudžbi (list)
l_id | Tko | Šta treba | Vrijeme | Komentar operatera
1 | 1 | 2 | % vremenska oznaka% | % operator_text%
2 | 2 | 1 | | % tekst%
3 | 3 | 2 | | % tekst%

Tabela br. 1 sadrži listu klijenata.
Tabela 2 sadrži listu usluga.
Tabela 3 sadrži listu tekućih naloga za operativne timove. Ova tabela se redovno ažurira i za popunjavanje se koristi web obrazac. S obzirom da dolazi dosta narudžbi, zapisi se unose u tabelu u obliku ID-a klijenata i usluga.

Stvarni problem je u tome što bi treća tabela trebala biti prikazana u web obrascu "odabir narudžbe" i umjesto ID-a potrebno je zamijeniti odgovarajuća polja iz drugih kolona.

kod:
$ query = "IZABIR * IZ liste";
$ rezultat = mysql_query ($ upit);
while ($ red = mysql_fetch_array ($ rezultat. // uzima rezultate iz svakog reda
(eho ""; // ispis podataka
}




CREATE TABLE "table_name" ("id" int (255) NOT NULL AUTO_INCREMENT, "list" text (80) NOT NULL, PRIMARY KEY ("id).

INSERT U "table_name" ("list") VRIJEDNOSTI ("bla-bla")



najbolji odgovor $ query =
"
odaberite kompanije.Kompanija, vrste_popravka.Vrste_popravka, lista.komentar_l
sa liste
kompanije za unutrašnje spajanje
na listi.Ko = kompanije.c_id
unutrašnji spoj repair_types
na listi "Šta treba" = repair_types.r_id
";

Nedavno su se rasprave o PHP jeziku na Habréu svele na mogućnosti projektovanja složenih sistema, što ne može a da ne raduje. Međutim, nakon što sam pogledao desetak najpriznatijih web okvira (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ i drugi), iskreno sam se iznenadio kada sam otkrio neke značajne nedostatke u smislu elementarne optimizacije.

Kako bi ova tema bila više tehnički orijentisana, rezultati su predstavljeni u rigoroznijem obliku, što može donekle otežati percepciju.

Dakle, idemo... Zadatak je krajnje jednostavan: provesti eksperimente o brzini formiranja nizova od podnizova u jednostrukim i dvostrukim navodnicima. U principu, ovo pitanje će biti relevantno dugo vremena zbog posebnosti obrade stringova u PHP-u.

Postoji mnogo članaka o osnovnoj optimizaciji skripte kako na ruskom tako i na drugim jezicima. Malo govori o stringovima, ali napominje činjenicu da se stringovi "raščlanjuju" u dvostrukim navodnicima za varijable i kontrolne znakove (kao u službenoj dokumentaciji). Na osnovu ovoga, logično je pretpostaviti da će korištenje stringova sa dvostrukim navodnicima na poslu biti nešto sporije od istih operacija sa podnizovima s jednostrukim navodnicima.

Osim zamjene varijabli u nizove i spajanja varijabli sa podstringovima, PHP implementira još najmanje jedan način formiranja stringova: rad sa sprintf funkcijom. Logično je pretpostaviti da će ova metoda biti značajno inferiorna u odnosu na "standardnu" zbog nepotrebnog poziva funkcije i raščlanjivanja niza unutar.

Jedini dodatak, prije nego što vam predstavim kod testne skripte: morate razmotriti 2 moguće opcije za rad sa stringovima u dvostrukim navodnicima: uzimajući u obzir jednostavan i "napredni" stil kodiranja. Ne treba obraćati pažnju na to da su varijable na samom početku reda, vjerovatno - to su samo primjeri:
$ string = "$ _SERVER [" HTTP_HOST "] - nije administracija regije Uljanovsk. Volimo ruski jezik i ne volimo one koji ga koriste..."
i
$ string = "($ _SERVER [" HTTP_HOST "]) - nije administracija regije Uljanovsk. Volimo ruski jezik i ne volimo one koji ga koriste ..."

Test broj jedan.
Pa, čini se da su sve rezervacije napravljene - vrijeme je da pokažemo rezultate rada. Izvorni kod testera se može pronaći.

Snimci ekrana pokazuju da moja hipoteza nije potvrđena. Ispostavilo se da je jedina ispravna pretpostavka o radu sa stringovima preko sprintf-a. Najbrže su funkcije koje rade s dvostrukim navodnicima.

Nakon kratkog razmatranja situacije, objašnjenje je došlo samo od sebe: poenta je da je referentni niz, u koji su izvršene zamjene, prekratak: parser koji prolazi duž takvog niza je beznačajna stvar. Međutim, čak i ovdje možete vidjeti da izvorna zamjena varijable u nizu daje prednost u odnosu na "napredni stil".
Ovo je takođe slabost pristupa konkatenacije: volumen umetnutih podataka premašuje volumen podstringova. Odakle dolaze režijski troškovi može se pročitati u već spomenutim habratopicima.

Međutim, i ove su misli morale biti potvrđene. Ovo je zahtijevalo drugi test sa promjenama iz mogućih razloga spomenutih za tako nepredvidivo (za mene) ponašanje. Očigledno je dosta toga izmenjeno u petoj verziji (priznajem, u petoj verziji php-a sam sproveo samo 1 test: da pređem elemente niza).

Test broj dva.
Druga hipoteza: produženje referentnog niza će u konačnici povećati postotak vremena rada testnih funkcija povezanih s formiranjem nizova u dvostrukim navodnicima u odnosu na rezultate testa 1. Istu situaciju, teoretski, treba promatrati u pogledu rad funkcije sprintf. To je prije svega zbog potrebe za raščlanjivanjem nizova i povećanja vremena utrošenog na to. U situaciji sa spajanjem podstringova u jednostruke navodnike, mislim da će se uočiti približno isti rezultat kao u prvom testu, što će do trenutka kada će dati blago smanjenje udjela vremena izvršavanja funkcije quotes_3 () cijela skripta radi (ali ne i povećanje performansi).

Zaključci su, zapravo, samo pozitivni i potvrđuju hipotezu. S blagim povećanjem referentnog niza pojavljuje se veliko opterećenje, što dovodi do smanjenja performansi funkcija za rad s dvostrukim navodnicima i sprintf-om.

Pretpostavka u vezi sa nizovima u pojedinačnim navodnicima se također pokazala točnom: umjesto 36,75% vremena u prvom testu, u drugom je funkcija quotes_3 () zauzela 33,76% vremena izvršavanja skripte

Praktična vrijednost.
Jednostavnim rečima, apstrahujući od podataka, možemo zaključiti: što je duži niz u kome treba da se izvrši zamena, veća je verovatnoća da će operacija spajanja biti izvršena brže od traženja varijable u dvostrukim navodnicima. Volonteri mogu pokušati odabrati potrebne parametre umetanja (broj varijabli, dužina referentnog niza, dužina nizova u varijablama) tako da zadovolje jednakost vremena izvršavanja.

To je, u stvari, sve. Ostaje samo dodati da nema sitnica u programiranju (to govorim onima koji vole da kažu "štedeti na šibicama" (c) Adelf). Poznavajući takve suptilnosti i uzimajući ih u obzir, možete napisati kod koji će biti optimizovan na svim nivoima;)

PS:
Testovi sprovedeni sa Zend Studio For Eclipse 6.0.0 (Debugger + Profiler uključen).
PHP verzija 5.2.5
Debian Linux OS

PPS:
Bilo bi mi drago da neko objavi svoje rezultate ovih testova. Mislim da će nam to omogućiti da objektivnije procijenimo potrebu za korištenjem jedne ili druge metode zamjene u nizovima. Također bih bio zahvalan za zdravu kritiku stila prezentacije i dizajna.