Internet ablakok Android

A generátor php -ben generálja, hogyan működik. PHP véletlenszám -generálás

Ebben a cikkben olyan generátorokat fogunk feltárni, amelyek egyszerű módot kínálnak az egyszerű iterátorok megvalósítására az Iterator interfész túlterheltsége és összetettsége nélkül.

Hogyan működnek a generátorok?

A Wikipédia szerint a generátor "nagyon hasonlít egy olyan függvényhez, amely olyan tömböt ad vissza, amelyben a generátor rendelkezik paraméterekkel, elnevezheti és létrehozhat egy értéksorozatot"... A generátor alapvetően olyan, mint egy függvény, de ahelyett, hogy értéket adna vissza, annyi értéket ad meg, amennyi szükséges. Hasonló a függvényhez, de iterátorként működik.

A generátorok a hozam kulcsszót használják a visszatérés helyett. A visszatéréshez hasonlóan jár el, visszaadja a hívó függvény értékét, de ahelyett, hogy eltávolítaná a függvényt a veremből, a hozam az állapotát menti. Ez a funkció lehetővé teszi, hogy onnan folytassa, ahol volt, amikor újra hívta. Valójában nem adhat vissza generátorértéket, bár használhat egy visszatérés nélküli értéket a végrehajtás befejezéséhez.

A PHP kézikönyve ezt írja: "Amikor generátor függvényt hívnak meg, akkor egy mozgatható objektumot ad vissza." Ez egy generátor belső osztály objektuma, és ugyanúgy implementálja az iterátor interfészt. Ennek az objektumnak az ismétlésével a PHP minden alkalommal meghívja a generátort, amikor értékre van szüksége. Ez az állapot csak akkor marad meg, ha a következő értékre van szükség.

A fenti kód kimenete a következő lesz:

A generátor elindult

0

1

2 -t biztosít

3 -at biztosít

4

A generátor elfogyott

Az első generátorunk

A generátorok nem új fogalmak, és már léteznek olyan nyelveken, mint a C #, a Python, a JavaScript és a Ruby, és általában használatuk alapján azonosítják őket. hozam kulcsszó. Az alábbiakban egy példa található a Pythonban:

Def file_lines (fájlnév): file = open (fájlnév) a fájlban lévő sorhoz: hozam sor file.close () a file_lines sorban ("somefile"): .............

Írjuk felül a Python generátort PHP -ben. (Ne feledje, hogy mindkét részlet nem hajt végre semmilyen hibaellenőrzést.)

A generátor funkció megnyitja a fájlt, majd szükség szerint elolvassa a fájl minden sorát. Minden alkalommal, amikor a generátort hívják, onnan folytatja, ahol abbahagyta. Nem kezdődik elölről, mivel állapota a művelet megerősítésekor mentésre került. Miután az összes sort elolvasta, a generátor egyszerűen kikapcsol, és a ciklus véget ér.

Visszatérő kulcsok

A PHP iterátorok kulcs / érték párokból állnak. Példánkban csak az érték került visszaadásra, ezért a billentyűk numerikusak voltak (a számbillentyűk az alapértelmezett értékek). Ha egy asszociatív párt szeretne visszaadni, egyszerűen módosítsa a hozamot, hogy a kulcs tartalmazza a tömb szintaxisát.

$ sor; ...) foreach (file_lines ("somefile") $ key => $ line) (.............)?>

Érték megadása

A hozam nemcsak értékeket ad vissza, hanem kívülről is fogadhat értékeket. Ez úgy történik, hogy a generátor objektum send () metódusát hívjuk meg értékkel, ha értéket is át akarunk adni. Ezt az értéket lehet használni számításokban vagy más dolgokban.

küld ("stop"); ) echo "($ v) n"; )?>

A kimenet a következő lesz:

Memória megőrzése generátorokkal

A generátorok praktikusak a nagy készletek kiszámításához, és ha nem akarja egyszerre lefoglalni a memóriát az összes eredményhez, vagy ha nem tudja, akkor szüksége lesz az összes eredményre. Az eredmények feldolgozásának módja miatt a memória mennyisége minimalizálható, ha csak az aktuális eredményhez rendel memóriát.

Képzeljünk el egy fájl () függvényt, amely tömbként adja vissza a fájl összes sorát. A fájl () egyszerű referenciapontjának (skálájának) és a file_lines () függvény bemutatójának manipulálásával, mindegyik ugyanazon véletlenszerű 100 bekezdéses szövegfájlokat használva a Lipsum használatával, megmutatta, hogy a file () függvény akár 110 -szer több memóriát használt, mint a generátor ...

A generátorok bevezetésével a PHP egy hatékony eszközt adott a fejlesztők kezébe. Most gyorsan írhatunk iterátorokat, és ezzel sok memóriát spórolhatunk meg. Ezzel az oktatóanyaggal remélem, elég lesz ahhoz, hogy maga is elkezdhesse használni őket projektjeiben.

Autóvezetéskor a sebesség nem minden. De WEB mindent a gyorsaság dönt. Minél gyorsabb az alkalmazás, annál jobb a felhasználói élmény. Ok, ez a cikk kb generátorok PHP -ben, akkor miért beszélünk a sebességről? Amint azt hamarosan látni fogja, a generátorok nagy különbséget tesznek az alkalmazás sebessége és a memóriafogyasztás tekintetében.

Mik azok a PHP generátorok?

Hozzáadva PHP az 5.5 verzióban A generátorok olyan funkciók, amelyek egyszerű mechanizmust biztosítanak az adatok hurkolására anélkül, hogy adattömböt kellene létrehozni a memóriában. Még mindig nem tudja, miről van szó? Akkor nézzük meg PHP generátorok Akcióban.

Hozzon létre egy fájlt generator_test.php a következő tartalommal:


$ tömb =;
($ i = 0; $ i< $max; $i++) {
$ tömb = $ i;
}
return $ array;
}

Foreach (getRange (15), mint $ tartomány) (
echo "Adatok ($ tartomány)
";
}

Ezután a mappában, ahol ez a fájl található, nyissa meg a konzolt, és írja be a következőt

Http: // localhost: 8000 / generator_test.php

Az eredmény a következő lesz:

Adatok 1
Adatok 2
….
Adatok 15

A fenti kód meglehetősen egyszerű. Végezzünk azonban egy apró változtatást:


echo "Adatok ($ tartomány)
";
}

Most a generált számok tartománya 0 és konstans között van PHP_INT_MAX, amely a legnagyobb egész szám, amelyet a tolmács képviselhet PHP... Ezután térjen vissza a böngészőbe, és frissítse az oldalt. Azonban ezúttal a sima szöveg helyett azt az üzenetet kapjuk, hogy túllépték a hangerőt. elérhető memória, aminek következtében a szkript rendellenesen leállt.

Milyen szégyen - u PHP elfogyott a memória! Az első dolog, ami eszébe jut, a beállítás módosítása. memory_limit a php.ini fájlban... De tegyük fel magunknak a kérdést - valóban ilyen hatékony? Valóban azt akarjuk, hogy egyetlen szkript foglalja el az összes rendelkezésre álló memóriát?

Generátorokat használunk

Írjuk fel ugyanazt a függvényt, mint fent, hívjuk ugyanazzal az értékkel PHP_INT_MAXés újra futni. De ezúttal mi hozzunk létre generátor függvényt.

Függvény getRange ($ max = 10) (
($ i = 1; $ i< $max; $i++) {
hozam $ i;
}
}

Foreach (getRange (PHP_INT_MAX) $ tartományként) (
echo "Adatok ($ tartomány)
";
}

Függvény meghatározása getRange ezúttal csak iteráljuk az értékeket, és kimenetet generálunk. Kulcsszó hozam hasonló az utasításhoz Visszatérés abban az értelemben, hogy visszaad egy értéket egy függvényből, de az egyetlen különbség az hozam csak akkor ad vissza értéket, ha szükséges, és nem próbálja egy mozdulattal beilleszteni a teljes adatsort a memóriába. A böngészőbe lépve látnia kell az oldalon megjelenített adatokat. Ügyeljen arra, hogy A PHP generátorai csak egy függvényen belül használhatók.

Miért van szükség generátorokra?

Időről időre felmerülnek ilyen feladatok, amikor nagy mennyiségű adatot kell feldolgoznunk (például naplófájlokat), számításokat kell végeznünk az adatbázisból származó nagy mintákon stb. És semmiképpen sem akarjuk, hogy ezek a műveletek elfoglalják az összes rendelkezésre álló memóriát, ezért meg kell próbálnunk a lehető legnagyobb mértékben megőrizni a memóriát. Az adatoknak nem kell nagyoknak lenniük - PHP generátorok hatékony az adatok méretétől függetlenül. És ne felejtsük el, hogy célunk az alkalmazás gyors és egyidejű elkészítése, hogy a lehető legkevesebb memóriát emészthesse.

Visszatérő kulcsok

Vannak esetek, amikor nemcsak egy értéket, hanem egy kulcs-érték párt is vissza kell adnunk. Generátorok használatakor kulcs-érték párokat hozhatunk létre az alábbiak szerint.

Függvény getRange ($ max = 10) (
($ i = 0; $ i< $max; $i++) {
$ érték = $ i * mt_rand ();
hozam $ i => $ érték;
}
}
?>

Ezt a függvényt ugyanúgy használhatjuk, mint egy egyszerű tömböt:

Foreach (getRange (PHP_INT_MAX) $ key => $ value) (
echo "Kulcs ($ kulcs) ($ érték)";
}

Értékek küldése a generátoroknak

A generátorok értékeket is felvehetnek. Ez alatt azt értjük, hogy a generátorok lehetővé teszik számunkra az értékek beszúrását, ami lehet egy parancs látszata vagy valami más. Például elküldhetünk egy értéket a generátorunknak, amely jelzi a végrehajtás leállításának vagy a kimenet megváltoztatásának szükségességét. Az alábbiakban egy mintakód található:

Függvény getRange ($ max = 10) (
($ i = 1; $ i< $max; $i++) {
$ inject = hozam $ i;
if ($ inject === "stop") return;
}
}

$ generator = getRange (PHP_INT_MAX);

Foreach ($ generátor $ tartományként) (
ha ($ tartomány === 10000) (
// üzenet küldése a generátornak
$ generátor -> küldés ("stop");
}
print "Érték ($ tartomány)
";
}

Vegye figyelembe, hogy az utasítás használatával Visszatérés v generátor funkciókat azonnal kilép ebből a funkcióból.

Végezetül szeretném kiemelni, hogy a generátorok jelentős teljesítményjavulást kínálnak, amelyet nem hagyhatunk figyelmen kívül. A legtöbb esetben nincs szükségünk erőteljes szerverekre a kódunk végrehajtásához - csak egy kis átalakítást kell elvégeznünk. A generátorok pedig nagyon hasznos eszközök, amelyeket gyakrabban kell használnunk anélkül, hogy túlzottan használnánk őket.

Mellesleg, a generátorokról A kurzusomban részletezem. Vannak példák és feladatok is, amelyek segítenek az anyag jobb asszimilálásában.

Most pedig készen állunk egy jelszógeneráló funkcióra, és írunk egy szkriptet, amellyel helyreállíthatjuk vagy létrehozhatunk új jelszót webhelye felhasználói számára.

Jelszó -helyreállító szkript

Általában hogyan írják a forgatókönyvet?

Mint mindig, lépésről lépésre elkészítjük a sémát, amelyet lépésenként kell végrehajtanunk. Minden egy fájlban történik, reminder.php

1. Csak akkor futtassa a szkriptet, ha van bizonyos változó, például $ action;

2. A felhasználó a jelszó létrehozásának megkezdéséhez adja meg email cím$ _POST [`ema'l`]; A kód egyszerűsítése érdekében hozzárendeljük adott érték változó $ email.

3. Ellenőrizze a szabályos kifejezések minden karakter annak biztosítására, hogy a felhasználó helyesen adta meg az e -mail címet. Ha nem, jelenítsen meg egy hibát, és fejezze be a szkriptet. Ha minden helyes, lépjünk tovább.

4. Az adatbázisban, esetünkben a felhasználók táblázatában keresünk azonos levelezési címmel rendelkező felhasználót. Ha nem, akkor hibát adunk ki, hogy nincs ilyen cím az adatbázisban, és leállítjuk a szkriptet.

5. Van egy ilyen címmel rendelkező felhasználó az adatbázisban, hajtsa végre és indítsa el az új jelszó létrehozásának funkcióját. Ezenkívül az e -mail címen egyedi felhasználói azonosítót kapunk az adatbázisból, és beírjuk a $ id változóba;

Reg.ru: domainek és tárhely

A legnagyobb regisztrátor és tárhelyszolgáltató Oroszországban.

Több mint 2 millió domain név működik.

Promóció, levelezés domainhez, üzleti megoldások.

Világszerte több mint 700 ezer ügyfél választott.

Bootstrap keretrendszer: gyorsan reagáló elrendezés

Lépésről lépésre bemutató videó bemutató a Bootstrap keretrendszer reszponzív elrendezésének alapjairól.

Tanuljon meg gépelni egyszerűen, gyorsan és hatékonyan egy hatékony és praktikus eszköz segítségével.

Elrendezés a megrendeléshez és a fizetéshez.

* Az egérmutatóval szüneteltetheti a görgetést.

Vissza előre

Véletlen karakterláncok generálása PHP -ben

Ebben a rövid bejegyzésben megmutatom, hogyan hozhat létre véletlen karakterláncot a PHP segítségével.

Hasonló feladat merülhet fel különböző helyzetekben, például:

Véletlen jelszó generálása előre meghatározott karakterkészletből;

Véletlen név generálása egy fájlhoz vagy mappához (azok elrejtése és védelme érdekében);

Ideiglenes egyedi azonosító létrehozása egy folyamathoz;

Véletlen karakterlánc használata "forrásanyagként" egy összetettebb szkripthez stb.

A véletlen karakterláncoknak más felhasználási lehetőségei is vannak, amelyekkel kreatív lehet.

A PHP -ban nincs olyan speciális funkció, amely elvégezné a számunkra érdekes feladatot, ezért szükség szerint saját maga kell írnia egy ilyen eszközt.

Az alábbiakban bemutatjuk a probléma megoldásának egyik lehetőségét.

// A függvénynek két paramétere van: a véletlen karakterlánc hossza és a kialakításában szereplő karakterek random_string ($ str_length, $ str_characters) ($ str_characters = array (0,1,2,3,4,5, 6,7,8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k" "," l "," m "," n "," o "," p "," q "," r "," s "," t "," u "," v "," w ", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" "," K "," L "," M "," N "," O "," P "," Q "," R "," S "," T "," U "," V ", "W", "X", "Y", "Z"); // A függvény véletlenszerű karakterláncot generálhat a cirill betűkkel // $ str_characters = array (0,1,2,3,4,5,6 , 7,8,9, "a", "b", "c", "g", "d", "e", "g", "z", "i", "k", "l" , "m", "n", "o", "p", "p", "s", "t", "y", "f", "x", "c", "h", " w "," u "," e "," u "," i "); // Hamis értéket ad vissza, ha az első paraméter nulla, vagy nem egész szám, ha (! is_int ($ str_length) || $ str_length< 0) { return false; } // Подсчитываем реальное количество символов, участвующих в формировании случайной строки и вычитаем 1 $characters_length = count($str_characters) - 1; // Объявляем переменную для хранения итогового результата $string = ""; // Формируем случайную строку в цикле for ($i = $str_length; $i >0; $ i--) ($ string. = $ str_characters;) // Az eredmény visszaadása return $ string; )

Mivel az anyag kezdőknek készült, elmagyarázom, hogyan működik ez a funkció.

A véletlen karakterlánc generálásának függvénye két paramétert tartalmaz. Az első a karakterek száma, amelyet látni szeretnénk a kapott karakterláncban. A második közvetlenül a karakterek tömbje, amelyet használni szeretnénk a generálás során.

Mivel a függvény végrehajtása értelmetlen, ha a kapott karakterlánc hossza nulla vagy negatív, és megszakad, ha nem egész számot adunk meg, ezeket a helyzeteket biztosítjuk, és hamisat adunk vissza.

Ha az első paraméter helyes, akkor a count () függvénnyel megszámoljuk a karakterlánc kialakításában részt vevő karakterek számát, és kivonunk egyet a kapott számból. Miért csináljuk ezt? Kicsit később válaszolok erre a kérdésre, de most térjünk át a funkcióra.

Változó deklarálásával $ karakterlánc a végeredmény tárolásához elkezdünk egy véletlenszerű sort generálni egy hurokban számára.

A számláló kezdeti értékeként $ i a ciklus azt jelenti, hogy hány karaktert szeretnénk látni a véletlen karakterláncban ($ str_length).

Ezután jön a feltétel, hogy a ciklust addig kell végrehajtani, amíg a számláló értéke nagyobb nullánál.

Végül a ciklus minden iterációja után a számláló értékét eggyel csökkentjük a "-" csökkenési operátor segítségével.

Így a ciklus annyi ismétlést hajt végre, amennyit a végső karakterlánc karaktereinek számát meg akarunk kapni.

Nos, most nézzük meg a ciklus törzsét, és térjünk vissza arra a kérdésre, hogy miért vontunk le egyet a változó összes karakteréből. $ str_characters.

Mint látható, a végső sort úgy alkotjuk, hogy sorban hozzáadjuk a változót $ karakterlánc egy karakter minden cikluson való áthaladáshoz.

Nézzük meg közelebbről.

A funkciót használjuk mt_rand ()és adja át két paramétert - nulla és ugyanaz a változó eggyel csökkentve $ karakter_hossz... Funkció mt_rand () lehetővé teszi számunkra, hogy egyszerűen létrehozzunk egy véletlen számot egy adott tartományban (azaz nullától egészen $ karakter_hossz).

Ennek a funkciónak a lényege, hogy segítségével létrehozunk egy véletlen számot, amelyet indexként használunk a tömbhöz. $ str_characters.

Az index jelzi, hogy melyik karakter származik a tömbből $ str_characters szeretnénk kapni.

Itt elérkeztünk a legfontosabb ponthoz. Ha az első elemet olyan konstrukció segítségével kaptuk meg

$ str_characters;

akkor az utolsó elemet megkaphatjuk a következő írásával (elvégre 62 elem van a tömbben):

$ str_characters;

Ez logikus lenne, de sajnos nem igaz.

Valójában az első elem elérhető a

$ str_characters;

és 62 elem (utolsó) keresztül

$ str_characters;

Ezt az értékek egyszerű megjelenítésével ellenőrizheti.

Most már teljesen világossá válik, hogy miért vontunk le egyet 62 -ből. Csak akkor, ha indexeink tartománya 0 és 61. között van. Ez biztosítja számunkra a véletlen karakterlánc helyes kialakítását anélkül, hogy véletlenül 62-es indexű nem létező elemre hivatkoznánk.

Ez minden. Érték visszaadása az operátor segítségével Visszatérés- és a funkciónk készen áll.

Továbbra is meg kell hívni, és paraméterként át kell adni a kívánt számú karaktert a véletlen sorunkban, például:

Echo random_string (16, $ str_characters);

Ennek eredményeként valami teljesen összefüggéstelen dolgot kapunk, például:

ATq4Lh9PNEm8cCxp

A cél megvalósult, és most kreatívan alkalmazhatjuk funkciónkat, ahol szükséges.

Természetesen funkciónk univerzális, és kiválóan működik oroszul is. A fenti kódban a tömb egy másik változatát láthatja $ str_characters(ki van jegyezve), amely cirill betűket tartalmaz.

Ennek ellenőrzéséhez megjegyzéseket fűzhetünk az első tömbhöz $ str_characters(latin karakterekkel), és vegye ki a második megjegyzést.

Ha most frissítjük az oldalt, akkor valami ilyesmit kapunk:

Ju4d70y779ki5

Így bármilyen kívánt szimbólumot használhat. Ehhez hozzáadhatja őket egy meglévő tömbhöz, vagy létrehozhat egy újat.

És végül egy megjegyzés, amely hasznos lehet.

Biztos vagyok benne, hogy Ön mint felhasználó találkozott véletlenszerűen generált jelszavakkal, amelyekben aligha lehet megérteni, mi ez a szimbólum:

Vagy az "l" kis betű, vagy az "1" szám;
- vagy orosz "c", vagy angol "c";
- vagy az orosz "y", vagy az angol "y";
- vagy nulla, vagy az "o" betű (ismét orosz vagy angol);
- stb.

Ezért, ha Ön maga generál valamilyen karakterláncot más felhasználók számára, akkor győződjön meg arról, hogy az egyértelműen érthető számukra. Képzeld el, hogy egy másik személy helyében vagy, és csodálkozol: "Mi ez?", "Betű vagy szám, a fenébe is?"

Felhívom a figyelmemet a megoldásra, amellyel html -t hozhatok létre PHP -ben. A feladat triviálisnak tűnik, de szeretném, ha bővíthető, rövid, de ugyanakkor jó funkcionalitású lenne. Nem tűnt rossznak.

Azonnal meg kell mondanom (ahogy sokan hisznek a hozzászólásokban), hogy a feladat nem az volt, hogy sablonmotort írjunk (amiből már sok van), és nem a JavaScript sablonmotor lecserélését. Tökéletesen tudom, hogy az igazi módszer a html és az adatok szétválasztása. De html -t kellett írnom az órákon, keretösszetevők létrehozásához, mint például a CGridView az yii -ben, érdemes -e ilyen helyekre html -t helyezni külön fájlokat te döntesz.

A fő cél az, hogy megszabaduljunk a html -től az osztályokban és a függvényekben.

Egy egyszerű példa, egy normál gomb:

CHtml :: create () -> p () -> a (array ("href" => "http://habrahabr.ru", "class" => "btn")) -> text ("Ugrás ide" ) -> render ();
Eredmény:

Menj

Semmi trükkös, csak erre korlátozódhat, de hurkokat akartam:
$ arr = array ("1" => "Első", "2" => "Második"); CHtml :: create () -> select ($ options) -> each (CHtml :: plainArray ($ arr, "value", "text")) -> option ("array (" value "=> $ data-> érték) ") -> szöveg (" $ data-> text ") -> end () -> endEach ()
Itt meg kellett hívni a plainArray () függvényt, amely a következőképpen alakítja a tömböt:
$ arr = tömb (tömb ("érték" => "1", "szöveg" => "Első"), tömb ("érték" => "2", "szöveg" => "Második");
A cikluson belüli címkék tartalmazhatnak függvényeket vagy karakterláncokat eval kifejezésekkel, bármilyen beágyazást, például táblázatot:

$ oszlopok = tömb (tömb ("id" => "NAME", "label" => "Név"), tömb ("id" => "AGE", "label" => "Age")); $ data = array (tömb ("NAME" => "Péter", "AGE" => 29), array ("NAME" => "Vaszilij", "KOR" => 32)); CHtml :: create () -> table () -> thead () -> tr () -> each ($ oszlopok) -> th () -> text (function ($ column) (return $ oszlop ["label" ];)) -> end () -> endEach () -> end () -> end () -> tbody () -> each ($ data) -> tr () -> each ($ oszlopok) -> td () -> szöveg (függvény ($ sor, $ oszlop) ($ $ [$ oszlop ["id"]];)) -> vége () -> endEach () -> vége () -> endEach ( ) -> render ();

A bezárt címkék automatikusan bezáródnak.

Az osztály kiterjeszthető űrlapon történő használatra. Bővítheti öröklődéssel vagy függőségi befecskendezéssel, az egyes címkék megjelenítéséhez és attribútumaihoz egy funkciót használva, így könnyen felülírhatja ezt a viselkedést.

A CMyHtml osztály kiterjeszti a CHtml -t (nyilvános függvény a ($ options = array ()) ($ default = array ("href" => "javascript: void (0)"); return parent :: a (array_replace ($ default, $ options ));))

CForm osztály (privát $ _lastLabel = ""; public function __construct (CModel $ model, CHtml $ html = null) ($ this -> _ model = $ model; $ this -> _ html = $ html ?: CHtml :: create ();) public function __call ($ method, $ ps) ($ options = $ ps? $ ps: array (); if ($ method === "label") ($ this -> _ lastLabel = isset ($ options ["for"])? $ this -> _ model-> getLabel ($ options ["for"]): "";) if ($ method === "text" && $ this -> _ lastLabel) ( $ options = $ options?: $ this -> _ lastLabel; $ this -> _ lastLabel = "";) $ this -> _ html -> $ method ($ options); return $ this;))

Maga a megoldás megtekinthető és kipróbálható