Iterace po znacích

Školení, která pořádám

Pokud je potřeba projít všechny znaky abecedy, lze to řešit tradičně:

<?php
for ($i=0; $i < 26; $i++) {
    echo chr(ord('A') + $i);
}
?>

V PHP lze však podobně jako v Perlu přímo inkrementovat i samotné znaky:

<?php
for ($ch = 'A'; $ch != 'AA'; $ch++) {
    echo $ch;
}
?>

Všimněte si, že podmínka ukončení je $ch != 'AA' a ne $ch <= 'Z', které by se nejspíš nabízelo. Je to proto, že 'Z' se inkrementuje na 'AA', které je při standardním lexikografickém uspořádání menší než 'Z'.

Jakub Vrána, Výuka, 29.9.2006, diskuse: 19 (nové: 0)

Diskuse

Juro Hajdúch:

No áno, ale škoda, že to nefunguje aj s diakritikou :o).

Juro Hajdúch:

A sme opäť pri kombinatorike. S tým sa oplatí experimentovať.
<?php
for ($ch = 'AA'; $ch != 'AAA'; $ch++) { // $ch = 'AAA' atď.
    echo $ch."<br/>";
}
?>

ikona dgx:

Nejen inkrementovat, ale i dekrementovat lze (tyhle slova nějak nemám rád, zní to tak ... ehm ... no šak víte).

Jinak se mi líbí, jak to respektuje velikost písmenek. Například 'aZz' + 1 je 'bAa'.

ikona MiSHAK:

Jaký to má smysl? (upřesnit)

Martin:

Třeba, když chces jít od A do P a nechce se ti počítat, na jakém místě P je :)

Juro Hajdúch:

Alebo pri stránkovani nekonečne dlhých abecedných zoznamov.

finc:

A kam se mi zařadí např. p. Čermáková? :)
Nezkoušel jsem, jestli set_locale pomůže pro českou specifikaci, ale než si hrát, udělám si na to např. pole.
$ch = array();
$ch[0] = "A";
...

adrive:

Nejako zložito nie?
$ch = array('A', 'B'); :D

finc:

No co se týče funkčnosti, tak to je naprosto identické. Co se týče zápisu, zkrácený zápis je dobrý po pole, které má 2-3 položky, ale když má obsahovat více jak 10 položek, je ten zápis matoucí. Tak kdo to pak má složité? :D

adrive:

no veď píšem, kto to má zložité... ja v podstate píšem len hodnoty pola, a nemusím sa obťažovať s indexami a premennými.

finc:

Jenže ty indexy se ti můžou později hodit při orientaci. To je ten důvod, proč to rozepisuji.
Ale není to zásadní rozdíl, když to funguje jak má. :)

3wl4k:

<?php
$pole
= array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
    3 => 'd',
    4 => 'e',
    5 => 'f',
    6 => 'g',
    7 => 'h',
    8 => 'i'
);
?>

IMHO je toto najprehladnejsi sposob (nesekol som sa dufam)

Juro Hajdúch:

Ak sa nemýlim, tak pokiaľ nie sú v poli deklarované žiadne kľúče prvkov, tak sa defaultne prvkom poľa prideľujú kľúče od nuly. Teda
<?php $pole = array('a','b','c','d','e'); ?>
je to isté ako píšeš ibaže kratšie a vlastne kľúče typu 0,1,2,3... možno používať aj tak.

finc:

Tento zápis je vhodný ve chvíli, kdy budu potřebovat občas do pole na různé pozice vložit další prvek, určitě bude jednodušší nedefinovat klíč podle posloupnosti. Na druhou stranu myslím, že česká abeceda je neměnná. Proto si toto pole rozepíši, abych na první pohled viděl na kterém místě je ten či onen znak.

vd:

Já byl také přesvědčen o neměnnosti sluneční soustavy a najednou máme 8 planet místo 9. Taky se může stát, že až jednou někoho na*re písmeno "ch" tak budeš přepisovat indexy. ;-)

ps: Nenávidím české pravidla pro řazení, kdopak je zruší? :-)

error414:

co
<?php
var_dump
(range('a','x'));
?>

array
  0 => 'a' (length=1)
  1 => 'b' (length=1)
  2 => 'c' (length=1)
  3 => 'd' (length=1)
  4 => 'e' (length=1)
  5 => 'f' (length=1)
  6 => 'g' (length=1)
  7 => 'h' (length=1)
  8 => 'i' (length=1)
  9 => 'j' (length=1)
  10 => 'k' (length=1)
  .........

je to asi nejjednodusi. Asi.

ikona MiSHAK:

Hm dělal bych to taky spíš přes pole... Ale otázka zněla jaký to má sakra smysl?

Michal:

Škoda že tohle nefunguje s UTF-8. Následující kód mi vypíše 5 řádků místo očekávaných tří:

<?php
$str
= "Kůň";
for (
$i=0; $i<strlen($str); $i++)
  printf("%d - %s - %s<br/>", $i, $str{$i}, ord($str{$i}));
?>

Výsledek:

0 - K - 75
1 -   - 197
2 -   - 175
3 -   - 197
4 -   - 136

ikona Jakub Vrána OpenID:

Lze použít funkce iconv_strlen a iconv_substr. Jak zjistit kód znaku jinak než ručně (opak funkce chr_utf8 z http://php.vrana.cz/html_entity_decode-s-utf-8-v-php-4.php) mě nenapadá.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.