Mallien käyttäminen PHP:ssä. Jokerimerkkien käyttö PHP:ssä Merkit ja merkkihakemistot merkkijonoissa

Kotiin / Selaimet

IN viime aikoina keskustelut PHP-kielestä Habréssa rajoittuvat enemmän suunnitteluominaisuuksiin monimutkaiset järjestelmät, joka ei voi muuta kuin iloita. Katsottuani tusinaa tunnetuimpia verkkokehyksiä (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ ja muut), olin vilpittömästi yllättynyt havaitessani joissakin merkittäviä puutteita alkeellisen optimoinnin näkökulmasta. .

Jotta aihe olisi teknisesti suuntautunut, tulokset esitetään tiukemmassa muodossa, mikä saattaa vaikeuttaa havaintoa jonkin verran.

Joten, mennään... Tehtävä on äärimmäisen yksinkertainen: tee kokeita merkkijonojen muodostamisen nopeudesta kerta- ja kaksoislainausmerkeissä olevista osamerkkijonoista. Periaatteessa tämä kysymys on edelleen ajankohtainen pitkään aikaan johtuen PHP:n merkkijonojen käsittelyn erityispiirteistä.

Skriptien perusoptimoinnista on monia artikkeleita sekä venäjäksi että muilla kielillä. Se kertoo vain vähän merkkijonoista, mutta huomauttaa, että lainausmerkeissä olevat merkkijonot "jäsentetään" muuttujia ja ohjausmerkkejä varten (kuten virallisessa dokumentaatiossa). Tämän perusteella on loogista olettaa, että merkkijonojen käyttö kaksoislainausmerkeissä on jonkin verran hitaampaa kuin samat toiminnot lainausmerkeissä olevilla osamerkkijonoilla.

Sen lisäksi, että PHP korvaa muuttujat merkkijonoiksi ja ketjuttaa muuttujia alimerkkijonoihin, PHP toteuttaa ainakin yhden tavan luoda merkkijonoja: työskentelee sprintf-funktion kanssa. On loogista olettaa niin tätä menetelmää tulee olemaan huomattavasti huonompi kuin "standardi" johtuen tarpeettomasta funktiokutsusta ja merkkijonojen jäsentämisestä.

Ainoa lisäys, ennen kuin esitän sinulle testikoodin: on 2 asiaa, jotka on otettava huomioon mahdollisia vaihtoehtoja työskentely kaksoislainattujen merkkijonojen kanssa: yksinkertaiset ja "kehittyneet" koodaustyylit huomioon ottaen. Sinun ei luultavasti pitäisi kiinnittää huomiota siihen, että muuttujat ovat aivan rivien alussa - ne ovat vain esimerkkejä:
$string = "$_SERVER["HTTP_HOST"] ei ole Uljanovskin alueen hallinto. Rakastamme venäjän kieltä, emmekä pidä niistä, jotka puhuvat sitä..."
Ja
$string = "($_SERVER["HTTP_HOST"]) ei ole Uljanovskin alueen hallinto. Rakastamme venäjän kieltä, emmekä pidä niistä, jotka puhuvat sitä..."

Testi numero yksi.
No, näyttää siltä, ​​​​että kaikki varaukset on tehty - on aika näyttää työn tulokset. Lähdekoodi testaaja löytyy.

Kuvakaappaukset osoittavat, että hypoteesiani ei vahvistettu. Ainoa oikea oletus osoittautui työskentelystä merkkijonojen kanssa sprintf:n kautta. Nopeimmat olivat funktiot, jotka toimivat nimenomaan lainausmerkeillä.

Tilannetta lyhyesti pohdittuaan selitys tuli itsestään: koko pointti on, että viitemerkkijono, johon vaihdot tehtiin, on liian lyhyt: jäsentäjän kulku tällaisen merkkijonon läpi on kakkua. Kuitenkin myös tässä on selvää, että muuttujan natiivi korvaaminen merkkijonoksi antaa etua "edistyneeseen tyyliin".
Tämä on myös ketjutusmenetelmän heikkous: lisätyn datan määrä ylittää alimerkkijonojen määrän. Mistä yleiskustannukset tulevat, voit lukea jo mainitusta habratopicista.

Nämäkin ajatukset vaativat kuitenkin vahvistusta. Tämä vaati toisen testin, jossa oli muutoksia mahdollisiin mainittuihin syihin tällaiseen (minun) arvaamattomaan käyttäytymiseen. Viidennessä versiossa on ilmeisesti paljon muokattu (myönnän, että PHP:n viidennessä versiossa tein vain yhden testin: taulukon elementtien läpikulkua).

Testi numero kaksi.
Toinen hypoteesi: viitemerkkijonon pidentäminen johtaa viime kädessä lainausmerkeissä olevien merkkijonojen muodostumiseen liittyvien testitoimintojen toiminta-ajan prosenttiosuuden kasvuun verrattuna testin numero 1 tuloksiin. Sama tilanne on teoriassa havaittava. suhteessa sprintf-funktion toimintaan. Tämä johtuu ennen kaikkea tarpeesta jäsentää merkkijonoja ja siihen käytetyn ajan lisääntymisestä. Tilanteessa, jossa osamerkkijonoja ketjutetaan yksittäisissä lainausmerkeissä, uskon, että havaitaan suunnilleen sama tulos kuin ensimmäisessä testissä, mikä antaa hieman pienenemisen lainausmerkit_3() -funktion suoritusajan osuuteen verrattuna suoritusaikaan koko käsikirjoituksen (mutta ei suorituskyvyn lisäystä).

Päätelmät ovat itse asiassa vain myönteisiä ja vahvistavat hypoteesin. Kun viitemerkkijonoa kasvaa hieman, syntyy suuri kuorma, mikä johtaa lainausmerkkien ja sprintf:n toimintojen suorituskyvyn heikkenemiseen.

Oletus merkkijonoista yksittäisissä lainausmerkeissä osoittautui myös oikeaksi: ensimmäisen testin 36,75 % sijaan, toisessa lainausmerkit_3() -funktio vei 33,76 % skriptin suoritusajasta.

Käytännön arvo.
Yksinkertaisesti sanottuna, tiedoista vedoten, voimme päätellä: mitä pidempi rivi, jolla korvaus on tehtävä, todennäköisemmin, että ketjutustoiminto suoritetaan nopeammin kuin muuttujan etsiminen lainausmerkeissä. Vapaaehtoiset voivat yrittää valita tarvittavat lisäysparametrit (muuttujien lukumäärä, viitemerkkijonon pituus, muuttujien merkkijonojen pituudet) siten, että ne täyttävät suoritusaikojen yhtäläisyyden.

Siinä kaikki, oikeastaan. On vain lisättävä, että ohjelmoinnissa ei ole pikkujuttuja (tarkoitan niille, jotka haluavat sanoa "säästöt otteluissa" (c) Adelf). Tietäen tällaiset hienovaraisuudet ja ottamalla ne huomioon, voit kirjoittaa koodia, joka optimoidaan kaikilla tasoillaan;)

PS:
Testit suoritettiin Zend Studio For Eclipse 6.0.0:lla (mukana Debugger + Profiler).
PHP versio 5.2.5
Debian Linux -käyttöjärjestelmä

PPS:
Olisin iloinen, jos joku julkaisee näiden testien tulokset. Uskon, että tämä mahdollistaa objektiivisemman arvioinnin tarpeesta käyttää yhtä tai toista merkkijonojen korvaamistapaa. Arvostan myös terveellistä kritiikkiä esitystyyliä ja muotoilua kohtaan.

Merkkijonotyypin arvot ovat tekstimerkkijonoja (lyhyesti merkkijonoja). Merkkijono on nollan tai useamman merkin sarja. Merkkejä ovat kirjaimet, numerot, välimerkit, erikoismerkkejä ja tilat.

Merkkijono voidaan määritellä neljällä eri tavoin:

  • kaksoislainausmerkit
  • yksittäisiä lainauksia
  • heredoc syntaksi
  • nowdoc syntaksi

Merkkijono lainausmerkeissä

Merkkijono lainausmerkeissä:

Voit käyttää Escape-sarjoja kaksoislainausmerkkijonoissa. Ohjausjärjestys— Nämä ovat erikoismerkkejä, jotka on suunniteltu muotoilemaan tekstitulostetta. Seuraavat pakosarjat ovat saatavilla PHP:ssä:

Kaksilainausmerkkisten merkkijonojen tärkein ominaisuus on kyky käsitellä muuttujia merkkijonojen sisällä.


Dollarin merkki: \$";

Lainausmerkkien sisällä olevat merkkijonot voivat sisältää yksittäisiä lainausmerkkejä:

Echo "Yksi lainaus: "";

Merkkijono yksittäisissä lainausmerkeissä (heittomerkit)

Merkkijono yksittäisissä lainausmerkeissä:

$str = "Merkkijono"; echo "Yksi iso rivi voidaan jakaa useiksi pieniksi riveiksi lukemisen helpottamiseksi.";

Toisin kuin kaksoislainausmerkkijonoissa ja heredoc-syntaksissa, muuttujat ja ohjaussekvenssit (yhtä poikkeusta lukuun ottamatta) yksittäisiä lainauksia, ei käsitellä. Tämä tarkoittaa, että ne tulkitaan tavallisiksi merkkijonomerkeiksi:

$num = 10; echo "Numero: $num
Dollarin merkki: \$";

Jotta voit käyttää yksittäisiä lainausmerkkejä yksittäisten lainausmerkkien sisällä olevassa merkkijonossa, sinun on poistettava ne kenoviivalla (\"). Jos haluat kirjoittaa kenoviivan, sinun on kopioitava se (\\):

Echo "Käytä \"yksittäisiä\" lainausmerkkejä"; echo "kenoviiva: \\";

Yksittäisiin lainausmerkkeihin suljetut merkkijonot voivat sisältää kaksoislainausmerkkejä:

Echo "Kaksoislainaus: "";

Heredoc syntaksi

Heredoc-syntaksi on vaihtoehtoinen tapa merkkijonojen kirjoittaminen.

Heredoc-syntaksilla määritetty merkkijono toimii samalla tavalla kuin lainausmerkkien sisällä oleva merkkijono. Ero Heredocin ja kaksoislainausmerkkijonon välillä on se, että Heredocissa ei tarvitse paeta lainausmerkkejä.

Heredoc-syntaksi alkaa kolmella merkillä<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Heti tunnisteen perässä tulee olla rivinvaihto, sen jälkeen ei saa olla muita merkkejä kuin rivinvaihto, muuten tapahtuu virhe. Seuraavaksi tulee itse merkkijonon sisältö. Merkkijonon sisällön jälkeen erilliselle riville on määritettävä sulkeva tunniste (sama kuin<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Nowdoc-syntaksi

Nowdoc-syntaksi, kuten Heredoc, on vaihtoehtoinen tapa kirjoittaa merkkijonoja.

Nowdoc-syntaksilla määritetty merkkijono toimii samalla tavalla kuin lainausmerkkien sisällä oleva merkkijono. Ero Nowdocin ja kertalainausmerkkijonon välillä on se, että Nowdocissa ei tarvitse välttää yksittäisiä lainausmerkkejä.

Nowdocin syntaksi on samanlainen kuin Heredocin, sillä ainoa ero on, että avaustunniste on suljettava lainausmerkkeihin:

$num = 10; kaiku<<<"some_id" Число: $num some_id;

Muuttujien käsittely merkkijonoissa

Merkkijonojen muuttujien käsittelyyn on olemassa kahdenlaisia ​​syntaksia: yksinkertainen Ja vaikea.

Yksinkertainen syntaksi- silloin muuttujan nimi ilmoitetaan rivillä sellaisenaan.

Kun tulkki kohtaa dollarimerkin, se alkaa tarkistaa peräkkäin, ovatko kaikki seuraavat merkit kelvollisia merkkejä muuttujan nimessä. Joten kelvollisen muuttujan nimen muodostamiseksi se kaappaa mahdollisimman monta merkkiä:

$str = "Maailma!"; echo "Hei $str";

Monimutkainen syntaksi- Tämä on silloin, kun muuttujan nimi on suljettu aaltosulkeisiin.

Koska tulkki sieppaa rivillä olevan muuttujan käsittelemiseksi mahdollisimman monta merkkiä, on tilanteita, joissa tulkki ei pysty itsenäisesti määrittämään, mihin muuttujan nimi päättyy:

$sport1 = "tahto"; $sport2 = "jalka"; echo "Pidän $sport1ballista ja $sport2ballista";

Tässä tapauksessa haluttua tulosta ei saavuteta, koska tulkki pitää $sport1 osana muuttujan nimeä $sport1bol, jota ei ole olemassa.

Jos haluat kertoa tulkille nimenomaisesti, mihin muuttujan nimi päättyy, sinun on sisällytettävä muuttujan nimi aaltosulkeisiin:

$sport1 = "tahto"; $sport2 = "jalka"; echo "Pidän ($sport1)bol ja ($sport2)bol.";

Dollarimerkki voidaan sijoittaa joko kiharan aaltosulkeen eteen tai sen jälkeen:

$sport1 = "tahto"; $urheilu2 = "jalka"; echo "Pidän $(sport1)bol ja ($sport2)bol.";

Yhdistäminen

Yhdistäminen on kahden tai useamman merkkijonon yhdistämistä yhdeksi suuremmaksi merkkijonoksi. Kytkentä tapahtuu käyttämällä ketjutusoperaattoria - . (piste). Yhdistettäessä jokainen seuraava rivi lisätään edellisen loppuun:

Minkä tahansa tyyppinen arvo, joka on ketjutettu merkkijonoon, muunnetaan implisiittisesti merkkijonoksi ja ketjutetaan sitten:

"; echo "Numero: " . 1; ?>

Kommentti: PHP 7.0.0:ssa 64-bittisissä alustoissa ei ole saavutettavissa olevia rajoituksia 32-bittisissä järjestelmissä, ja PHP:n aiemmissa versioissa rivit eivät voi olla suurempia kuin 2 Gt (2147483647 tavua).

Syntaksi

Merkkijono voidaan määrittää neljällä eri tavalla:

  • yksittäisiä lainauksia
  • kaksoislainausmerkit
  • nowdoc-syntaksi (PHP 5.3.0:sta lähtien)

Yksittäiset lainaukset

Yksinkertaisin tapa määrittää merkkijono on laittaa se lainausmerkkeihin (symboli " ).

Jos haluat käyttää yhtä lainausta merkkijonon sisällä, poista se kenoviivalla ( \ ). Jos sinun on kirjoitettava kenoviiva itse, kopioi se ( \\ ). Kaikki muut kenoviivan käyttötavat tulkitaan normaaleina merkeinä: tämä tarkoittaa, että jos yrität käyttää muita estosarjoja, kuten esim. \r tai \n, ne tulostetaan sellaisenaan minkään erityisen käyttäytymisen sijaan.

kaiku "tämä on yksinkertainen merkkijono";

kaiku "Voit myös lisätä riveihin
rivinvaihtohahmo kuten tämä,
Tämä on hyvä"
;

// Tulokset: Arnold sanoi kerran: "Tulen takaisin"
kaiku "Eräänä päivänä Arnold sanoi: "Tulen takaisin.";

Kaiku "Poistitko C:\\*.*?";

// Lähdöt: Poistitko C:\*.*?
echo "Poistitko C:\*.*?" ;

// Lähdöt: Tätä ei laajenneta: \n rivinvaihto
kaiku "Tätä ei laajenneta: \n uusi rivi";

// Tulokset: $expand ja $joko muuttujia ei laajenneta
kaiku "$expand ja $joko muuttujaa ei ole laajennettu";
?>

Tuplalainausmerkit

Jos merkkijono on lainausmerkkien (") sisällä, PHP tunnistaa seuraavat erikoismerkkien erotussekvenssit:

Pakojaksot
Jakso Merkitys
\n rivinvaihto (LF tai 0x0A (10) ASCII:ssa)
\r vaunun paluu (CR tai 0x0D (13) ASCII:ssa)
\t vaakasuora välilehti (HT tai 0x09 (9) ASCII:ssa)
\v pystyvälilehti (VT tai 0x0B (11) ASCII:ssa) (PHP 5.2.5:stä lähtien)
\e Escape-merkki (ESC tai 0x1B (27) ASCII:ssa) (PHP 5.4.4:stä lähtien)
\f sivusyöte (FF tai 0x0C(12) ASCII:ssa) (PHP 5.2.5:stä lähtien)
\\ kenoviiva
\$ dollarin merkki
\" kaksoislainaus
\{1,3} merkkijono, joka vastaa oktaalimerkin säännöllistä lauseketta, joka vuotaa äänettömästi yli mahtuakseen tavuun (eli "\400" === "\000")
\x(1,2) merkkijono, joka vastaa merkin säännöllistä lauseketta heksadesimaalimuodossa
\u(+) merkkijono, joka vastaa Unicode-merkkien säännöllistä lauseketta, joka kartoitetaan UTF-8-esityksen merkkijonoon (lisätty PHP 7.0.0:aan)

Kuten yksittäisiin lainausmerkkeihin suljetun merkkijonon kohdalla, minkä tahansa merkin poisto tulostaa myös itse poistomerkin. Ennen PHP 5.1.1:tä kenoviiva sisään \($var) ei julkaistu.

Heredoc

Kolmas tapa määrittää merkkijonoja on käyttää heredoc-syntaksia: <<< . Tämän operaattorin jälkeen sinun on määritettävä tunniste ja sitten rivinvaihto. Tämän jälkeen tulee itse rivi ja sitten sama tunniste, joka sulkee lisäyksen.

Linja pitäisi aloita sulkevalla tunnisteella, ts. sen tulee näkyä rivin ensimmäisessä sarakkeessa. Lisäksi tunnisteen on noudatettava samoja nimeämissääntöjä kuin kaikkien muiden PHP-tunnisteiden: sisältää vain aakkosnumeerisia merkkejä ja alaviivaa, eikä se saa alkaa numerolla (alaviivat ovat sallittuja).

Huomio

On erittäin tärkeää huomata, että päättävä tunnusrivi ei saa sisältää muita merkkejä kuin puolipiste ( ; ). Tämä tarkoittaa, että id ei saa olla sisennystä ja että puolipisteen edessä tai jälkeen ei saa olla välilyöntejä tai sarkaimia. On myös tärkeää ymmärtää, että ensimmäisen merkin ennen sulkevaa tunnistetta on oltava rivinvaihtomerkki käyttöjärjestelmäsi määrittelemällä tavalla. Esimerkiksi UNIX-järjestelmissä, mukaan lukien macOS, tämä on \n. Uuden rivin tulee myös alkaa välittömästi sulkevan tunnuksen jälkeen.

Jos tätä sääntöä rikotaan ja sulkeva tunniste ei ole "puhdas", oletetaan, että sulkeva tunniste puuttuu ja PHP jatkaa sen etsimistä. Jos tässä tapauksessa oikeaa sulkevaa tunnistetta ei löydy, se aiheuttaa jäsennysvirheen komentosarjan lopussa olevan rivinumeron kanssa.

Esimerkki #1 Esimerkki virheellisestä syntaksista

luokka foo (
julkinen $bar =<<baari
EOT;
// sisennys ennen sulkevaa tunnistetta ei ole sallittu
}
?>

Esimerkki #2 Esimerkki oikeasta syntaksista

luokka foo (
julkinen $bar =<<baari
EOT;
}
?>

Heredocia ei voi käyttää luokkakenttien alustamiseen.

PHP 5.3:sta alkaen tämä rajoitus koskee vain sellaisia ​​heredocseja, jotka sisältävät muuttujia niiden sisällä.

Heredoc-teksti toimii samalla tavalla kuin merkkijono lainausmerkeissä ilman niitä.

Tämä tarkoittaa, että sinun ei tarvitse pakottaa lainausmerkkejä heredocissa, mutta voit silti käyttää yllä olevia erotussarjoja.<<Muuttujat käsitellään, mutta sinun on oltava yhtä varovainen käytettäessä monimutkaisia ​​muuttujia heredocissa kuin työskennellessäsi merkkijonojen kanssa.
Esimerkki #3 Heredoc-merkkijonomäärittelyesimerkki
$str =
Esimerkkilinja,

kattaa useita rivejä,
{
käyttämällä heredoc-syntaksia.
EOD;

Luokka foo
{
var $foo ;
var $bar ;
}
}

Function__construct()
$this -> foo = "Foo" ;

$tämä -><<$foo = uusi foo(); .
$name = "Nimi" ;
kaiku .
Nimeni on "$nimi". Kirjoitan $foo -> foo
EOT;
?>

Nyt päättelen

($foo -> baari [ 1 ])

Tämän pitäisi tulostaa iso kirjain "A": \x41

Nimeni on "Nimi". Kirjoitan Foo. Nyt tuon Bar2:n. Tämän pitäisi tulostaa iso kirjain "A": A

On myös mahdollista käyttää heredoc-syntaksia tietojen välittämiseen funktioargumenttien kautta:
Versiosta 5.3.0 lähtien staattisten muuttujien ja luokan ominaisuuksien/vakioiden alustaminen on tullut mahdolliseksi heredoc-syntaksin avulla:
{
Esimerkki #5 Heredocin käyttäminen staattisten muuttujien alustamiseen<<// Staattiset muuttujat
funktio foo()
}

staattinen $bar =
Täällä ei ole mitään...
{
LABEL;<<// Vakiot/luokkaominaisuudet
luokka foo

const BAR =<<Esimerkki vakion käytöstä
luokka foo
}
?>

FOOBAR;

Julkinen $baz =

Esimerkki kentän käytöstä PHP 5.3.0:sta lähtien Heredoc-tunnisteen voi myös ympäröidä lainausmerkeillä: Nytdoc ilmoittamalla tekstilohkon, jota ei ole tarkoitus käsitellä.

Nowdoc on merkitty samalla järjestyksellä <<< , jota käytetään tässä asiakirjassa, mutta seuraava tunniste on esimerkiksi lainausmerkeissä, <<<"EOT" .

Kaikki heredoc-tunnisteita koskevat ehdot koskevat myös nowdocia, erityisesti ne, jotka koskevat sulkevaa tunnistetta.

$tämä -><<<"EOD"
Esimerkki #7 Esimerkki nowdocin käytöstä
Esimerkkiteksti,
kattaa useita rivejä
käyttämällä nowdoc-syntaksia. Kenoviivaa käsitellään aina kirjaimellisesti,
esimerkiksi \\ ja \".

EOD;

Tämän esimerkin suorittamisen tulos:

Esimerkki tekstistä, joka kattaa useita rivejä nowdoc-syntaksilla. Kenoviivaa käsitellään aina kirjaimellisesti, kuten \\ ja \".

Esimerkki #8 Nowdoc-merkkijono, joka lainaa esimerkkiä muuttujilla
Täällä ei ole mitään...
{
/* Monimutkaisempi esimerkki muuttujilla. */
julkinen $foo ;

Luokka foo
{
var $foo ;
julkinen $bar ;
}
}

Function__construct()
$this -> foo = "Foo" ;

$tämä -><<<"EOT"
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
Nimeni on "$nimi". Tulostan $foo->foo.
Nyt tulostan ($foo->bar).
EOT;
?>

EOD;

Tämän ei pitäisi tulostaa isoa kirjainta "A": \x41

Nimeni on "$nimi". Tulostan $foo->foo. Nyt tulostan ($foo->bar). Tämän ei pitäisi tulostaa isoa kirjainta "A": \x41

luokka foo (
julkinen $bar =<<<"EOT"
baari
EOT;
}
?>

Kommentti:

Esimerkki #9 Esimerkki staattisen tiedon käyttämisestä

nowdoc-tuki lisättiin PHP 5.3.0:aan.

Muuttujien käsittely

Jos merkkijono on määritetty lainausmerkeissä tai käyttämällä heredocia, sen sisällä olevat muuttujat käsitellään. Syntaksia on kahta tyyppiä: yksinkertainen ja monimutkainen. Yksinkertainen syntaksi on helpompaa ja kätevämpää. Se mahdollistaa muuttujan, taulukon arvon ( joukko) tai kohteen ominaisuuksia (

esine

) vähällä vaivalla.

Monimutkainen syntaksi voidaan tunnistaa lauseketta ympäröivistä aaltosulkeista. $ Yksinkertainen syntaksi

Jos tulkki kohtaa dollarin merkin (

), se kaappaa mahdollisimman monta merkkiä kelvollisen muuttujan nimen muodostamiseksi. Jos haluat määrittää nimen lopun, kirjoita muuttujan nimi aaltosulkeisiin.

$mehu = "omena" ;
echo "Hän joi $mehumehua." . PHP_EOL ;

// Väärin. "s" on kelvollinen merkki muuttujan nimelle, mutta muuttujan nimi on $juice.
echo "Hän joi mehua, joka oli valmistettu $mehuista." ;
?>

EOD;

// Oikein. Muuttujan nimen loppu ilmoitetaan tarkasti suluissa:

echo "Hän joi mehua, joka oli tehty $( mehu ) s." ; Syntaksia on kahta tyyppiä: yksinkertainen ja monimutkainen. Hän joi omenamehua. Hän joi mehua, joka oli valmistettu . Hän joi omenoista valmistettua mehua. joukko Joukkoelementti ( ] ) merkitsee indeksin määritelmän loppua. Objektin ominaisuuksiin sovelletaan samat säännöt kuin yksinkertaisiin muuttujiin.

Esimerkki #10 Yksinkertainen syntaksiesimerkki

define ("KOOLAID" , "koolaid1" );
$mehut = array("omena" , "oranssi" , "koolaid1" => "violetti" );

echo "Hän joi $mehut [ 0 ] mehua." . PHP_EOL ;
echo "Hän joi $mehua [ 1 ] mehua." . PHP_EOL ;
echo "Hän joi $mehuja [ koolaid1 ] mehua." . PHP_EOL ;

luokan ihmiset (
julkinen $john = "John Smith" ;
julkinen $jane = "Jane Smith" ;
julkinen $robert = "Robert Paulsen" ;

Julkinen $smith = "Smith" ;
}

$ihmiset = uudet ihmiset();

echo "$people -> john joi $mehut [ 0 ] mehua." . PHP_EOL ;
echo " $people -> john sanoi sitten hei $peoplelle -> jane ." . PHP_EOL ;
echo "$people -> Johnin vaimo tervehti $peoplea -> robert." . PHP_EOL;
echo " $people -> robert tervehti kahta $ihmästä -> sepät." ; // Ei onnistu
?>

EOD;

Hän joi omenamehua. Hän joi appelsiinimehua. Hän joi violettia mehua. John Smith joi omenamehua. John Smith tervehti sitten Jane Smithiä. John Smithin vaimo tervehti Robert Paulsenia.

PHP 7.1.0 lisätty tuki negatiivinen numeeriset indeksit.

Esimerkki #11 Negatiiviset numeeriset indeksit

$string = "merkkijono" ;
kaiku "Indeksin -2 merkki on yhtä suuri kuin$merkkijono [- 2 ]." , PHP_EOL ;
$merkkijono [- 3 ] = "o" ;
kaiku "Merkin muuttaminen sijainnissa -3 o:ksi tuottaa seuraavan rivin:$merkkijono." , PHP_EOL;
?>

EOD;

Merkki, jonka indeksi on -2, on yhtä suuri kuin n. Vaihtamalla merkin kohdassa -3 "o":ksi saadaan seuraava rivi: vahva

Jos kyseessä on monimutkaisempi, käytä monimutkaista syntaksia.

Monimutkainen (kihara) syntaksi

Sitä ei kutsuta kompleksiseksi siksi, että se on vaikea ymmärtää, vaan koska se sallii monimutkaisten ilmaisujen käytön.

Mikä tahansa merkkijonoon kartoitettu skalaarimuuttuja, taulukkoelementti tai objektiominaisuus voidaan esittää merkkijonossa tätä syntaksia käyttämällä. Kirjoita lauseke samalla tavalla kuin rivin ulkopuolelle ja kääri se sitten sisään { Ja } . Koska { ei voida välttää, tämä syntaksi tunnistetaan vain, kun $ seuraa suoraan { . Käyttää {\$ tulostaa {$ .

Muutama havainnollistava esimerkki:
// Näytä kaikki virheet

virhe_raportointi(E_ALL);

$hieno = "hieno" ;
// Ei toimi, tulosteet: Tämä on (hieno)

echo "Tämä on ( $hieno )" ;
// Toimii, tulosta: Tämä on hienoa

echo "Tämä on ( $hieno )" ;
kaiku // Toimii"Tämä aukio on leveä

( $neliö -> leveys ) 00 senttimetriä." ;
echo "Tämä toimii: ( $arr [ "avain" ]) " ;

echo "Tämä on ( $hieno )" ;
echo "Tämä toimii: ( $arr [ 4 ][ 3 ]) " ;

// Tämä on virheellinen samasta syystä kuin $foo ulkopuolella
// rivit. Toisin sanoen se toimii edelleen,
// mutta koska PHP etsii vakio foo ensin, tämä aiheuttaa
// tasovirhe E_NOTICE (määrittämätön vakio).
kaiku "Tämä on väärin:( $arr [ foo ][ 3 ]) " ;

// Toimii. Käytettäessä moniulotteisia taulukoita sisäisesti
// rivit käyttävät aina kiharoja aaltosulkeet
echo "Tämä toimii: ( $arr [ "foo" ][ 3 ]) " ;

// Toimii.
echo "Tämä toimii: " . $arr [ "foo" ][ 3 ];

kaiku "Tämäkin toimii:( $obj -> arvot [ 3 ]-> nimi ) " ;

kaiku "Tämä on nimetyn muuttujan arvo$nimi : ($( $nimi )) " ;

kaiku "Tämä on muuttujan nimen arvo, jonka getName() palauttaa:($( getName ())) " ;

kaiku "Tämä on muuttujan nimen arvo, jonka \$object->getName() palauttaa:($( $object -> getName ())) " ;

// Ei toimi, tulostaa: Tämän getName() palauttaa: (getName())
kaiku "Tämän getName() palauttaa: (getName())";
?>

Tämän syntaksin avulla on myös mahdollista päästä käsiksi merkkijonojen objektien ominaisuuksiin.

luokka foo (
var $bar = "Olen baari." ;
}

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

EOD;

Olen baari. Olen baari.

Kommentti:

Funktiot, menetelmäkutsut, staattiset luokkamuuttujat ja luokkavakiot toimivat sisäisesti {$} , alkaen PHP 5:stä. Annettua arvoa käsitellään kuitenkin muuttujan nimenä samassa yhteydessä kuin riviä, jossa se on määritelty. Yksittäisten kiharoiden olkaimet ( {} ) ei toimi funktioiden, menetelmien, luokkavakioiden tai staattisten luokkamuuttujien arvojen käyttämiseen.

Muutama havainnollistava esimerkki:
// Näytä kaikki virheet

luokan oluet (
const virvoitusjuoma = "juuriolut" ;
julkinen staattinen $ale = "ipa" ;
}

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

// Tämä toimii, tulostaa: Haluaisin A & W
echo "Haluaisin ($( oluet :: virvoitusjuoma )) \n" ;

// Tämäkin toimii, tulostaa: Haluaisin Alexander Keithin
echo "Haluaisin ($( beers :: $ale )) \n" ;
?>

Merkkijonon merkin käyttäminen ja muuttaminen

Merkkijonoissa olevia merkkejä voidaan käyttää ja muokata määrittämällä niiden siirtymä merkkijonon alusta alkaen nollasta, hakasulkeissa merkkijonon jälkeen, esimerkiksi $str . Ajattele tätä tarkoitusta varten olevaa merkkijonoa merkkijonona. Ja Jos sinun on hankittava tai korvattava enemmän kuin yksi merkki, voit käyttää toimintoja.

Kommentti: PHP 7.1.0:sta lähtien negatiivisia offset-arvoja tuetaan. Ne määrittävät siirtymän rivin lopusta. Aiemmin negatiiviset poikkeamat aiheuttivat tasovirheen E_NOTICE luettaessa (palauttaa tyhjä merkkijono) tai E_VAROITUS

Kommentti: kirjoitettaessa (jätä rivi ennalleen).

Huomio

Merkkijonossa olevaa merkkiä voidaan käyttää myös aaltosulkeilla, esimerkiksi $str(42) . luettaessa (palauttaa tyhjä merkkijono) tai Jos yritetään kirjoittaa rivin rajojen yli olevaan siirtymään, merkkijono täytetään välilyönneillä tähän siirtymään asti. Muut kuin kokonaislukutyypit muunnetaan kokonaislukutyypeiksi.

Huomio

Väärä offset-tyyppi aiheuttaa tasovirheen

Kommentti: .

Vain määritetyn merkkijonon ensimmäistä merkkiä käytetään.

PHP 7.1.0:sta lähtien tyhjän merkkijonon määrittäminen aiheuttaa vakavan virheen. Aikaisemmin tässä tapauksessa oli määritetty nollatavu (NULL).
PHP:n merkkijonot ovat sisäisesti tavuja. Tästä syystä merkkijonon käyttäminen tai muokkaaminen siirtymällä ei ole turvallista monitavuiselle koodaukselle, ja se tulisi tehdä vain yksitavuisissa koodauksissa, kuten ISO-8859-1, oleville merkkijonoille.
PHP 7.1.0:sta lähtien tyhjän indeksin käyttö aiheuttaa aiemmin vakavan virheen, tässä tapauksessa merkkijono muunnettiin taulukoksi ilman varoitusta.

Esimerkki #12 Joitakin esimerkkijonoja
// Hanki merkkijonon ensimmäinen merkki

$str = "Tämä on testi." ;
$ensimmäinen = $str [ 0 ];
// Hanki merkkijonon kolmas merkki

$kolmas = $str [ 2 ];
// Hae merkkijonon viimeinen merkki
$str = "Tämä on vielä testi." ;

?>

$last = $str [ strlen ($str ) - 1 ]; // Muuta rivin viimeistä merkkiä$str = "Katso merta" ; 0 .

$str [ strlen ($str )- 1 ] = "e" ;

PHP 5.4:stä lähtien merkkijonon siirtymä on määritettävä joko kokonaislukuna tai merkkijonona, joka sisältää numeroita, muuten annetaan varoitus. Aikaisemmin merkkijonon kaltainen offset

"foo"
, ilman varoitusta muutettiin muotoon

Esimerkki #13 Erot PHP 5.3:n ja PHP 5.4:n välillä
$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" ]));

Kommentti:

Yritetään käyttää muun tyyppisiä muuttujia (lukuun ottamatta taulukoita tai objekteja, jotka toteuttavat tiettyjä rajapintoja) käyttämällä tai {} palaa hiljaa NULL.

Kommentti:

PHP 5.5 lisäsi tuen merkkijonoliteraaleissa olevien merkkien käyttämiseen syntaksin avulla tai {} .

Merkkijonojen muokkaamiseen on monia hyödyllisiä toimintoja.

Perusfunktiot on kuvattu merkkijonofunktioita käsittelevässä osiossa, ja tarkennetun haun ja korvaamisen osalta Perl-yhteensopivia säännöllisiä lausekefunktioita.

Muunna merkkijonoksi

Arvo voidaan muuntaa merkkijonoksi castin avulla (merkkijono), tai toimintoja strval(). kaiku tai Lausekkeissa, joissa vaaditaan merkkijono, muunnos tapahtuu automaattisesti. Tämä tapahtuu, kun käytät toimintoja painaa.

, tai kun muuttujan arvoa verrataan merkkijonoon. Käsikirjan Tyypit ja Tyyppikäsittely -osioiden lukeminen selventää seuraavaa. Katso myös settype() Taulukot muunnetaan aina merkkijonoksi Syntaksia on kahta tyyppiä: yksinkertainen ja monimutkainen."Matriisi" kaiku tai Lausekkeissa, joissa vaaditaan merkkijono, muunnos tapahtuu automaattisesti., joten et voi näyttää taulukon sisältöä ( ), käyttämällä nähdäksesi mitä se sisältää. Jos haluat tarkastella yksittäistä elementtiä, käytä jotain tällaista

echo $arr["foo"] . Katso alta vinkkejä kaiken sisällön näyttämiseen/katsomiseen. Muuntaa tyyppimuuttujan "Esine" tyypiltään

merkkijono NULL Käytetään taikamenetelmää __toString.

Merkitys muunnetaan aina tyhjäksi merkkijonoksi. Ja Kuten yllä näkyy, taulukoiden, objektien tai resurssien suora muuntaminen merkkijonoksi ei anna muuta hyödyllistä tietoa arvoista itsestään kuin niiden tyypeistä..

Parempi tapa tulostaa arvoja virheenkorjausta varten on käyttää funktioita print_r().

var_dump()

Useimmat PHP:n arvot voidaan muuntaa merkkijonoksi jatkuvaa tallennusta varten. Tätä menetelmää kutsutaan serialisoinniksi ja se voidaan tehdä funktiolla

serialize() Merkkijonojen muuntaminen numeroiksi Jos merkkijono tunnistetaan numeeriseksi arvoksi, tuloksena oleva arvo ja tyyppi määritetään seuraavasti. Jos merkkijono ei sisällä mitään merkkejä ".", "e" tai "E" ja luvun arvo on kokonaislukujen alueella (määritelty PHP_INT_MAX ), merkkijono tunnistetaan kokonaisluvuksi ().

Arvo määräytyy merkkijonon alun perusteella. Jos rivi alkaa kelvollisella numeerisella arvolla, sitä arvoa käytetään. Muussa tapauksessa arvo on 0 (nolla). Kelvollinen numeerinen arvo on yksi tai useampi numero (joka voi sisältää desimaalipilkun), jota edeltää valinnaisesti etumerkki, jota seuraa valinnainen eksponentti. Eksponentti on "e" tai "E", jota seuraa yksi tai useampi numero.

$foo = 1 + "10,5" ; // $foo on kelluva (11.5)
$foo = 1 + "-1.3e3" ; // $foo on kelluva (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo on kokonaisluku (1)
$foo = 1 + "bob3" ; // $foo on kokonaisluku (1)
$foo = 1 + "10 pientä porsasta" ; // $foo on kokonaisluku (11)
$foo = 4 + "10,2 pientä possua" ; // $foo on kelluva (14.2)
$foo = "10.0 sikaa" + 1 ; // $foo on kelluva (11)
$foo = "10,0 sikaa" + 1,0 ; // $foo on kelluva (11)
?>

Lisätietoja tästä muunnoksesta on Unix-dokumentaation strtod(3)-osiossa.

Jos haluat testata mitä tahansa tämän osan esimerkeistä, kopioi ja liitä se ja seuraava rivi nähdäksesi mitä tapahtuu:

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

Älä odota saavasi merkin koodia muuntamalla se kokonaisluvuksi (kuten tehdään esimerkiksi C:ssä). Voit muuntaa merkit ASCII-koodeiksi ja takaisin käyttämällä toimintoja ord() Ja chr().

Merkkijonotyypin toteutustiedot

7 vuotta sitten

Dokumentaatiossa ei mainita, mutta sulkeva puolipiste heredocin lopussa tulkitaan itse asiassa oikeaksi puolipisteeksi ja sellaisenaan johtaa joskus syntaksivirheisiin.

$foo =<<abcd
END;
?>

Tämä ei:

foo (<<abcd
END;
);
// syntaksivirhe, odottamaton ";"
?>

Ilman puolipistettä toimii hyvin:

foo (<<abcd
LOPPU
);
?>

3 vuotta sitten

Voit käyttää merkkijonoa kuten merkkijonoa (kuten C)

$a = "Merkkijonotaulukkotesti";

var_dump($a);
// Palauttaa merkkijono(17) "String array testi"

var_dump($a);
// Palautusmerkkijono(1) "S"

// -- Array castilla --
var_dump((taulukko) $a);
// Palauttaa array(1) ( => string(17) "String array testi")

var_dump((taulukko) $a);
// Palautusmerkkijono(17) "S"

Norihiori

15 vuotta sitten

Voit käyttää monimutkaista syntaksia asettaaksesi sekä objektin ominaisuuksien että objektimenetelmien arvon merkkijonoon. Esimerkiksi...
luokkakoe(
julkinen $yksi = 1 ;
julkinen toiminto kaksi() (
paluu 2;
}
}
$testi = new Test();
echo "foo ( $test -> one ) bar ( $test -> two ())" ;
?>
Tulostaa "foo 1 bar 2".

Et kuitenkaan voi tehdä tätä kaikille nimiavaruuden arvoille. Luokkavakiot ja staattiset ominaisuudet/menetelmät eivät toimi, koska monimutkainen syntaksi etsii "$".
luokkakoe(
const YKSI = 1;
}
echo "foo (Testi::ONE) bar" ;
?>
Tämä tulostaa "foo (Test::one) bar". Vakiot ja staattiset ominaisuudet edellyttävät merkkijonon hajottamista.

3 vuotta sitten

Varo, että "Merkon merkkijonon muuntaminen numeroiksi" mukaisesti:

Jos ("123abc" == 123 ) kaiku "(intstr == int) testaa virheellisesti tosi.";

// Koska toinen puoli on numero, merkkijono muunnetaan väärin intstr:stä int:ksi, joka sitten vastaa testinumeroa.

// Totta kaikille ehdollisille, kuten if- ja switch-lauseille (luultavasti myös while-silmukaille)!

// Tämä voi olla valtava turvallisuusriski testattaessa/käytettäessä/tallennettaessa käyttäjän syötteitä, kun odotellaan ja testataan vain kokonaislukua.

// Näyttää siltä, ​​että ainoa korjaus on, että 123 on merkkijono "123", joten muuntamista ei tapahdu.

?>

6 vuotta sitten

Merkkijonojen etunollia ei käsitellä (vähintään yllätys) oktaaleina.
Harkitse:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x on $x, y on $y"; //tulostaa "x on 123, y on 83"
toisin sanoen:
* lähdekoodin numeeristen literaalien etunollat ​​tulkitaan "oktaaliksi", vrt. strtol().
* merkkijonojen etunollia (esim. käyttäjän toimittamat tiedot), kun ne on siirretty (implisiittisesti tai eksplisiittisesti) kokonaislukuun, jätetään huomiotta ja niitä pidetään desimaalilukuina, ks. strtod().

10 vuotta sitten

Tässä on helppo hakkerointi, jonka avulla kaksoislainausmerkkijonot ja heredocs voivat sisältää mielivaltaisia ​​lausekkeita aaltosulkeissa, mukaan lukien vakiot ja muut funktiokutsut:

// Hakkerointiilmoitus
funktio _expr ($v ) (palauttaa $v ; )
$_expr = "_expr" ;

// Meidän leikkipaikka
define("qwe" , "asd");
määritellä("zxc", 5 );

$a= 3 ;
$b= 4 ;

toiminto c($a, $b) (paluu$a+ $b; }

//Käyttö
kaiku"ennen{ $_expr(1 + 2 )} postata\n"; // tulostaa "pre 3 post"
kaiku"ennen{ $_expr(qwe)} postata\n"; // tulostaa "pre asd post"
kaiku"ennen{ $_expr(c($a, $b)+ zxc* 2 )} postata\n"; // tulostaa "pre 17 post"

// Yleinen syntaksi on ($_expr(...))
?>

2 vuotta sitten

Ajattelin, että olisi hyödyllistä lisätä tämä kommentti, jotta tiedot näkyvät ainakin PHP-sivuston oikealla sivulla.

Huomaa, että jos aiot käyttää kaksoislainausmerkkiä assosiatiivisen avaimen kanssa, saatat törmätä T_ENCAPSED_AND_WHITESPACE-virheeseen. Jotkut pitävät tätä yhtenä vähemmän ilmeisistä virheilmoituksista.

Ilmaisu, kuten:

$hedelmä=array(
"a"=> "omena",
"b"=> "banaani",
//jne
);

Painaa "Tämä on a$hedelmä[ "a"]"; // T_ENCAPSED_AND_WHITESPACE
?>

hajoaa varmasti palasiksi.

Voit ratkaista sen seuraavasti:

Lausekkeissa, joissa vaaditaan merkkijono, muunnos tapahtuu automaattisesti."Tämä on a$hedelmä[ a] " ; // Avaa lainaus
Lausekkeissa, joissa vaaditaan merkkijono, muunnos tapahtuu automaattisesti."Tämä on a${ hedelmää[ "a"]} " ; // Monimutkainen syntaksi
Lausekkeissa, joissa vaaditaan merkkijono, muunnos tapahtuu automaattisesti."Tämä on a{ $hedelmä[ "a"]} " ; // Monimutkainen syntaksimuunnelma
?>

Pidän henkilökohtaisesti viimeistä muunnelmaa, koska se on luonnollisempi ja lähempänä sitä, miltä ilmaus olisi merkkijonon ulkopuolella.

Ei ole selvää (ainakin minulle), miksi PHP tulkitsee väärin lausekkeen sisällä olevan lainauksen, mutta luulen, että sillä on jotain tekemistä sen kanssa, että lainausmerkit eivät ole osa arvomerkkijonoa - kun merkkijono on jo jäsennetty, lainausmerkit vain tulla tielle...?

2 vuotta sitten

Molempien pitäisi toimia :(

luokkaaTestaus{
julkinen staattinen
$VAR= "staattinen";
julkinen const VAR =
"const";

Julkinen toiminta sano hei Static() {
kaiku
"Hei:{ $tämä:: $VAR} " ;
}

Julkinen toiminta sano HelloConst() {
kaiku
"Hei:{ $tämä::VAR)" ; //Jäsennysvirhe: syntaksivirhe, odottamaton ")", odotetaan "["
}
}

$obj= uusiTestaus();
$obj-> sano hei Static();
$obj-> sano HelloConst();

3 vuotta sitten

Jotain mitä olen kokenut, mikä epäilemättä auttaa jotakuta. . .
Editorissani tämä korostaa HTML:n ja $kommentin syntaksia:

$html =<<<"EOD"
$kommentti
Esimerkkilinja,

Tämän käyttäminen näyttää kaikki saman värin:

$html =<<$kommentti
Esimerkkilinja,

mikä tekee sen kanssa työskentelystä paljon helpompaa

11 vuotta sitten

Älä lue aikaisempia kommentteja päivämääristä säästääksesi mielesi ;)

Kun molemmat merkkijonot voidaan muuntaa numeerisiksi (("$a" > "$b") -testissä), käytetään tuloksena saatuja numeerisia numeroita, muuten FULL-merkkijonoja verrataan merkki kerrallaan:

var_dump("1.22" > "01.23" ); //bool(false)
var_dump("1.22.00" > "01.23.00" ); //bool(tosi)
var_dump("1-22-00" > "01-23-00" ); //bool(tosi)
var_dump((kellua)"1.22.00" > (kelluke)"01.23.00" ); //bool(false)
?>

(PHP 4, PHP 5, PHP 7)

str_replace — Korvaa kaikki hakumerkkijonon esiintymät korvaavalla merkkijonolla

Kuvaus

Tämä funktio palauttaa merkkijonon tai taulukon, jossa kaikki aiheen haun esiintymiset korvataan sanalla korvaa.

Jos monimutkaisia ​​haku-/korvaussääntöjä (kuten säännöllisiä lausekkeita) ei tarvita, tämän toiminnon käyttö on suositeltavaa preg_replace().

Luettelo parametreista

Jos etsi ja korvaa ovat taulukoita, niin str_replace() käyttää kutakin arvoa vastaavasta taulukosta aiheen etsimiseen ja korvaamiseen. Jos korvaavassa taulukossa on vähemmän elementtejä kuin haussa, tyhjää merkkijonoa käytetään jäljellä olevien arvojen korvaavana merkkijonona.

Jos haku on taulukko ja korvaa on merkkijono, tätä korvausmerkkijonoa käytetään jokaiselle hakutaulukon elementille. Käänteisessä tapauksessa ei ole järkeä.

Jos etsi tai korvaa ovat taulukoita, niiden elementit käsitellään ensimmäisestä viimeiseen. Hakuarvo, joka tunnetaan myös nimellä neula

(neula). Voit käyttää taulukkoa useille hakuarvoille.

Korvata

Korvausarvoa käytetään korvaamaan hakuarvot. Voit käyttää taulukkoa useille arvoille.

Aihe Merkkijono tai taulukko, joka etsii ja korvaa, suoritetaan, joka tunnetaan myös nimellä heinäsuovasta

(heinäsuovasta).

Jos aihe on taulukko, haku ja korvaaminen suoritetaan jokaiselle aiheelementille, ja funktion tulos on myös taulukko.

Palautusarvot

Tämä funktio palauttaa merkkijonon tai taulukon, jonka arvot on korvattu.

Esimerkkejä

Esimerkki #1 Käyttöesimerkkejä str_replace()

// antaa
$bodytag = str_replace ("%body%" , "musta" , " " );

// määrittää: Hll Wrld f PHP
$vokaalit = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ($vokaalit, "" , "Hello World of PHP" );

// antaa: Sinun pitäisi syödä pizzaa, olutta ja jäätelöä joka päivä
$lause = "Sinun pitäisi syödä hedelmiä, vihanneksia ja kuitua joka päivä.";
$terve = array("hedelmät" , "vihannekset" , "kuitu" );
$namia = array("pizza" , "olut" , "jäätelö" );

$uusi lause = str_korvaa($terve, $namia, $lause);

// antaa: 2
$str = str_replace ("ll" , "" , "hyvä kulta neiti molly!" , $count );
echo $count ;
?>

Esimerkki #2 Esimerkkejä mahdollisista temppuista str_replace()

// Korvaava tilaus
$str = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order = array("\r\n" , "\n" , "\r" );
$korvaa = "
" ;

// Käsittelee \r\n ensin, jotta niitä ei korvata uudelleen.
echo $newstr = str_replace ($järjestys, $korvaa, $str);

// Tulostaa F, koska A korvataan B:llä, sitten B C:llä ja niin edelleen...
// Tämän seurauksena E korvataan F:llä, koska korvaus tapahtuu vasemmalta oikealle.
$haku = array("A" , "B" , "C" , "D" , "E" );
$korvaa = array("B" , "C" , "D" , "E" , "F" );
$aihe = "A" ;
echo str_replace ($haku, $korvaa, $aihe);

// Tulokset: applerootrootnut (edellä mainitusta syystä)
$kirjaimet = array("I" , "noin" );
$hedelmä = array("omena" , "pähkinä" );
$text = "Olen noin" ;
$tulostus = str_replace ($kirjaimet, $hedelmä, $teksti);
echo $lähtö ;
?>

Huomautuksia

Kommentti: Tämä toiminto on turvallista käsitellä tietoja binäärimuodossa.

Varoitus

Huomautus vaihtomenettelystä

Koska str_replace() suorittaa korvaamisen vasemmalta oikealle, jolloin useita korvauksia käytettäessä se voi korvata aiemmin lisätyn arvon toisella.

Kommentti:

Katso myös esimerkkejä tällä sivulla. Tämä toiminto on kirjainkoon erottelukykyinen. Käyttää str_ireplace()



kirjainkoolla ei ole merkitystä.

Taulukot:
C_id | Yritys | Sijainti
1 | LLC Haku | Kudykinon kenttä 15/3
2 | JSC Elita | Slunysvalinsk 133/7

3 | OJSC Pyschpyshch | Soldatodachestroyskoe 404
Korjaustyyppi (korjaustyypit)
r_id | Korjaustyypit |
1 | Vasara + naulat
2 | Kauneuden opastus

3 | Suuri remontti
Tilausluettelo (luettelo)
l_id | Kuka | Mitä tarvitaan | Aika | Operaattorin kommentti
1 | 1 | 2 | %timestamp% | %operator_text%
2 | 2 | 1 | | %teksti%

3 | 3 | 2 | | %teksti%
Taulukko 1 sisältää luettelon asiakkaista.
Taulukko 3 sisältää luettelon operatiivisten ryhmien nykyisistä tilauksista. Tätä taulukkoa päivitetään säännöllisesti ja sen täyttämiseen käytetään verkkolomaketta. Koska tilauksia tulee melko paljon, taulukkoon syötetään tietueet asiakastunnuksen ja palvelun muodossa.

Itse asiassa ongelma on, että kolmas taulukko pitäisi näyttää "tilausvalinta" -verkkolomakkeessa ja sinun on korvattava tunnuksen sijaan vastaavat kentät muista sarakkeista.

Koodi:
$query = "VALITSE *LISTA";
$tulos = mysql_query($kysely);
while($row=mysql_fetch_array($result. // ottaa tulokset jokaiselta riviltä
( echo "";// ulostulotiedot
}




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

INSERT INTO "taulukon_nimi" ("luettelo") ARVOT ("bla-bla")



paras vastaus $kysely =
"
valitse yritykset.Yritys, korjaus_tyypit.Korjaustyypit, lista.kommentti_l
listalta
sisäiset liitosyritykset
luettelossa.Kuka = ​​yritykset.c_id
sisäliitoksen korjaus_tyypit
luettelossa."Mitä tarvitsee" = korjaustyypit.r_id
";

© 2024 ermake.ru - Tietoja PC-korjauksesta - Tietoportaali