Új témakörünk első leckéje a stringek pozíciójával, azaz a strpos funkcióval foglalkozik. Elsőre talán furcsának tűnhet a funkció neve, de ha a string position angol kifejezésre gondolsz, észreveheted, hogy a két szó három-három betűjéből tevődik össze a név.
A PHP-programozói karriered során nagyon fontos lesz, hogy jól tudj bánni a stringekkel. Minden bizonnyal elő fog fordulni, hogy olyan programozói problémával találod szemben magad, amely megköveteli, hogy kikeress bizonyos adatokat egy stringből. A stringekkel kapcsolatos leendő szakértelmed alapköve a strpos funkció, mely lehetővé teszi, hogy megtaláld az adatokat a stringben.
A stringekben való keresés
A strpos funkció két paraméterrel működik — az első a string, melyben keresni szeretnénk, a második pedig az a string, amelyet keresünk. Ha a funkció találatra bukkan, az első találat pozícióját írja ki. Ha nincs találat, akkor a funkció eredménye hamis.
Hogy teljesen világos legyen, hogyan fest ez a gyakorlatban, vegyünk egy rendezett, számozott stringet, és keressünk rá az 5-ös számra.
PHP-kód:
$numbered_string = '1234567890'; // 10 numbers 1 to 0
$five_pos = strpos($numbered_string, '5');
echo 'Az 5 helyzete a stringben ' . $fivePos;
Megjelenítés a böngészőben:
Az 5 helyzete a stringben 4
Megfigyelhetted, hogy ez egy kicsit furcsa — joggal kérdezheted, hogy miért 4 a helyzet, azaz a pozíció. Nos azért, mert a PHP 0-tól kezdi a számolást.
1 szám – 0. pozíció – Nincs találat
2 szám – 1. pozíció – Nincs találat
3 szám – 2. pozíció – Nincs találat
4 szám – 3. pozíció – Nincs találat
5 szám – 4. pozíció – Találat
Egyszerű kis példánkban csak egyetlen karaktert kerestünk, de ennek a funkciónak a segítségével bármilyen karakterszámú stringre rákereshetünk. Fontos megjegyezni, hogy ez a funkció az első találat kezdetének a helyzetét írja ki. Vagyis ha a fenti stringben az „567890” stringre kerestünk volna rá, megint a 4. pozíción bukkantunk volna találatra, mert itt kezdődik az egyezés.
A strpos funkció egyik hátránya, hogy csak a legelső egyezés helyzetét írja ki. Ha 5000 másik találat is van, arról nem fogunk tudni, ha csak erre a módszerre hagyatkozunk!
Létezik egy harmadik (opcionális) paraméter is, mely lehetővé teszi, hogy pontosan meghatározzuk, hol kezdje a strpos funkció a keresést. Ha megjegyezzük az utolsó egyezés helyzetét, és ehhez hozzáadunk egyet, a funkció átugorja az első egyezést, és a következőre ugrik.
PHP-kód:
$numbered_string = '1234567890123456789012345678901234567890';
$five_pos = strpos($numbered_string, '5');
echo 'Az 5 helyzete a stringben ' . $five_pos;
$five_pos2 = strpos($numbered_string, '5', $five_pos + 1);
echo '<br />A második 5 helyzete a stringben ' . $five_pos2;
Megjelenítés a böngészőben:
Az 5 helyzete a stringben 4
A második 5 helyzete a stringben 14
Azzal, hogy fogtuk az első találat helyzetét (4), és hozzáadtunk egyet, arra utasítottuk a strpos funkciót, hogy az első találat után kezdje a keresést. A kód második részének kivitelezése során a funkció valójában a 6789012345... stringben keresett, és ezzel lehetővé tette, hogy megtaláljuk a string második 5-ösét is.
Lépjünk vissza néhány leckét, és idézzük fel a PHP while loopról tanultakat. Emlékszel? Ha igen, akkor elég, ha hozzáadsz néhány sort a kódhoz, és megkeresheted az összes 5-öst a numbered_string megnevezésű példastringünkben.
PHP-kód:
$numbered_string = '1234567890123456789012345678901234567890';
$offset = 0; // initial offset is 0
$five_counter = 0;
// Először leellenőrizzük, van-e "5" a 0 pozíción.
if (strpos($numbered_string, '5') == 0) {
$five_counter++;
echo '<br />A #' . $five_counter . ' ötös a következő pozíción van - 0';
}
// Az 5-ösök keresése a string többi részében
while ($offset = strpos($numbered_string, '5', $offset + 1)) {
$five_counter++;
echo '<br />A #' . $five_counter . ' ötös a következő pozíción van - ' . $offset;
}
Megjelenítés a böngészőben:
A #1 ötös a következő pozíción van – 4
A #2 ötös a következő pozíción van – 14
A #3 ötös a következő pozíción van – 24
A #4 ötös a következő pozíción van – 34
A feltételes állítás a while loopban egy kicsit ijesztőnek tűnhet, de ha részekre bontjuk, sokkal érthetőbb.
Jó gyakorlást!