Ahoj, řeším problém se kterým si niko neví rady. Potrebuji kdyz dostanu pismenko A aby ho zmenil na B, B na C, C na D ...
tendle problem mam vyreseny pomoci:
$text = "A";
echo strtr($text, "ABCDEFGHCHIJKLMNOPQRSTUVWXYZ", "BCDEFGHCHIJKLMNOPQRSTUVWXYZA");
problem nastane u pismenka CH to mi to nahradi HI ale ma byt nahrazeno I.
Nevite nekdo jak se to da vyresit?
Fórum › PHP
Abeceda
hm, pismenko ch neexistuje :) takze, uprime, o nicem jednoduchym nevim...pokud ale chces neco sifrovat.. . tak bych to vubec neresil a mrkl se na funkce char() a ord()
return strtr($text, Array('ch', 'a', b', 'c', ... ), Array('i, 'b', 'c', 'd', ...));
To hrach : Pismenko ch existuje, zapisuje sa vsak dvoma znakmi. http://sk.wikipedia.org/wiki/Ch_(písmeno) ;-)
To ench : pardon :) nechal jsem se unest :)
To Prog. :
myslel jsem toto:
CH nemá vlastnú pozíciu a je teda reprezentovateľné iba postupnosťou ASCII znakov "c" a "h" ("C" a "h", "C" a "H")
Posledni reseni se mi libi a prijde mi rozumne. Ale nevim jak ziskat ASCII hodnotu pismene a pricist k ni jedna a vypst. Myslel jsem jestli neni nice jako s cisly ze je hodim do promene $cislo++ a je hotovo. Sl ASCII mi to prijde podobne ale nevim jak s tim zachazet. Poradite? Rekneme ze mam:
$pismeno = 'CH';
//a chci o uroven vetsi pomoci ASCII
Dekuji
To ches : ch prave v ascii neni
A co neco takoveho?
$text = "CHAHA";
// CHAHA -> !AHA
$text = str_replace("CH","!",$text);
// !AHA -> IB!B
$text = strtr($text, "ABCDEFGH!IJKLMNOPQRSTUVWXYZ", "BCDEFGH!IJKLMNOPQRSTUVWXYZA");
// IB!B -> IBCHB
$text = str_replace("!","CH",$text);
To ches : Nejlepší by bylo smířit se s tím že písmenko CH prostě není a nebo vyzkoušet tu Zelenáčovu metodu.
Jinak ascii hodnotu např. A získáš takto:
$ascii=ord(A);
$ascii++;
$prevedeny_znak = chr($ascii); //mělo by být B
A na takovém principu budeš převádět celý řetězec, ale nezapomeň na tu výjimku u Z, jinak tam budeš mít nějaké nesmyslné znaky :) (prostě to co následuje v ASCII tabulce za Z, http://cs.wikipedia.org/wiki/ASCII )
Nechapem co mate proti mojmu rieseniu ?
Prog. napsal:
return strtr($text, Array('ch', 'a', b', 'c', ... ), Array('i, 'b', 'c', 'd', ...)); ...
To ches : Prečo vlastne potrebuješ to písmeno ch kodovať ako jedno písmeno? Nestačí ho chápať jednoducho ako dva znaky c, h ? Tie sa jednoducho prevedú na d, i.
To pecan987 : Máš tam chybiču, chýbajú ti uvodzovky:
$ascii=ord("A");
To ches: Pozri si http://www.php.net/str_rot13 http://www.php.net/str_rot13, dole v prispevkoch sa riesilo nieco podobne...
nechci jej kodovat. Jede mi o to ze mam databazi a kazdy novy zaznam musi mit pridelene pismenko abecedy vyssi nez to posledni aktualni v databazi. Vcetne prave ch.
Popis.
Admin klikne na tlacitko novy zaznam. Script provede vyhledani v databazi nejvyssiho pismene a cisla (A1, B1 ...) Zjisti ze nejvyssi je treba C1 tak chci aby pro novy zaznam nastavil D1 a kdyz bude nalezeno posledni pismeno Z(1 nebo jine cislo) nastavi zase A ale bude mit cislo o uroven vyssi. Takze A2. A tak porad dokola az treba do A55.
no tak
$ascii=ord('A');
$ascii++;
$prevedeny_znak = chr($ascii); //mělo by být B
echo $prevedeny_znak; // je opravdu B
ale problem je zase s tim CH. To mi vrati D. Bere jen C. Da se to nejak zaridit?
tu funkci s tim polem jsem resil takto ale nefunguje mi. vraci porad poseldni pismenko $bez
$s = array("a","b","c");
$bez = array("b","c","a");
$hotovo = str_replace($s, $bez, $text);
Uf, atypicke cislovanie :-D
Samozrejme ze pri ch bude problem, pretoze ch nie je jeden znak, ale dva znaky, ch nema vlastnu asci hodnotu. Preto fcia ord berie iba prvy znak, cize C.
Preco ti nefunguje ten replace neviem, mal by byt vpohode.
Co keby si sa vykaslal na vseobecny algoritmus, a napisal si to presne na tvoj pripad.
t.j. mas nejaky posledny kod, povedzme ze $last = 'CH3';
a chces vediet dalsi, takze $next.
cca takto:
if (substr($last,1,1)=='H') // ak sa zacina na pismeno na pismeno CH
$next = 'I'.substr($last,2);
elseif (substr($last(0,1))=='Z') // ak sa zacina na pismeno Z
$next = 'A'. (intval(substr($last,1))+1);
else // ak sa zacina na hocijake ine pismeno
$next = chr(ord(substr($last(0,1))+1). substr($last,1);
// (napisane sfleku => moze obsahovat chyby)
btw, nemyslim ze je to dobry sposob, pretoze si neviem celkom predstavit to vyhladavane z databazy, zoradovanie, zistovanie posledneho zaznamu a tak,... Myslim ze rozumnejsie by bolo pouzit klasicne cisielkovanie a napisat si nejaku funkciu, ktora ti prevedie cislo na ten kod (napr 1 = A1, 2 = B1, 3 = C1, ...) a dalsiu na spatny prevod.
To ches :
ches napsal:
...s tim polem jsem resil takto ale nefunguje mi. vraci porad poseldni pismenko $bez
$s = array("a","b","c");
$bez = array("b","c","a");
$hotovo = str_replace($s, $bez, $text);
Uz viem, jasne ze to vracia stale posledny, lebo a nahradi za b, lenze potom zisti ze b ma nahradit ze c a tak dalej... Dokonca aj ked to pole napises odzadu, tak tam bude problem s prvym a poslednym znakom, takze touto cestou asi nie :-)
hazi mi to chybu na $next = 'A'.(intval(substr($last,1))+1);
ono to neni sifrovani. Jde o evidovani zvirat do databaze. Vrhu. Kazdy novy vrh zacina na nove pismenko abecedy poporade. Proto je potreba aby tam pismenka byly vsechny a aby se zajistilo ze uzivatel zadne nepreskoci chtel jsem aby to script delal automaticky. Kdyby slo vyuzit databaze jako ze seautomaticky novemu zaznamu priradi unikatni ID tak by to bylo skvele. A1, B1, C1 ... Y1, Z1, A2, B2, C2.. A15, B15, C15
Chyb tam bolo viac, opravene:
if (substr($last,0,1)=='H') // ak sa zacina na pismeno na pismeno H
$next = 'CH'.substr($last,1);
elseif (substr($last,1,1)=='H') // ak sa zacina na pismeno na pismeno CH
$next = 'I'.substr($last,2);
elseif (substr($last,0,1)=='Z') // ak sa zacina na pismeno Z
$next = 'A'. (intval(substr($last,1))+1);
else // ak sa zacina na hocijake ine pismeno
$next = chr(ord(substr($last,0,1))+1) . substr($last,1);
echo $next;
Hej, len si skontroluj, ako za sebou ti tie znaky idu, ci tam nebude nejaky problem s x, y, w, a inymi znakmi... Alebo, ak chces mat istotu, tak si zadefinuj vlastne pole znakov. $znaky = Array('A','B','C','D',...) a potom pracuj iba s tymto polom podobne ako s ascii tabulkov. namiesto ord($znak) pouzijes fciu array_search($znak,$znaky) a namiesto chr($pozicia) pouzijes $znaky[$pozicia].
Automaticke pridelovanie ID ti bude fungovat jednoducho, ale len s cislami. To znamena, ze strcis do DB novy zaznam bez toho aby si definoval kod a ona automaticky prideli dalsie cislo. Ale si len pri celych, alebo prirodzenych cislach (integer alebo unsigned integer). Je potom na tebe, ze v uzivatelskom prostredi toto obycajne cislo prevedies a zobrazis ho ako kod. Na to budes potrebovat fciu, ktora toto cislo prevedie na kod a mozno sa zide aj k nej inverzna....
tak jsem to vyresil takto:
$i = 'CH';
switch($i)
{
case 'A': echo "B"; break;
case 'B': echo "C"; break;
case 'C': echo "D"; break;
case 'D': echo "E"; break;
case 'E': echo "F"; break;
case 'F': echo "G"; break;
case 'G': echo "H"; break;
case 'H': echo "CH"; break;
case 'CH': echo "I"; break;
case 'I': echo "J"; break;
case 'J': echo "K"; break;
case 'K': echo "L"; break;
case 'L': echo "M"; break;
case 'M': echo "N"; break;
case 'N': echo "O"; break;
case 'O': echo "P"; break;
case 'P': echo "Q"; break;
case 'Q': echo "R"; break;
case 'R': echo "S"; break;
case 'S': echo "T"; break;
case 'T': echo "U"; break;
case 'U': echo "V"; break;
case 'V': echo "W"; break;
case 'W': echo "X"; break;
case 'X': echo "Y"; break;
case 'Y': echo "Z"; break;
case 'Z': echo "A"; break;
}
a je to funkcni i s CH. Jen potrebuji jeste vyresit ze kdyz $i = 'A1' nebo $i = 'A23' nebo $i = 'CH1' ci $i = 'CH23' abych ziskal dve promene. $pismeno a $cislo abych mohl pracovat pouze s pismeny pro navyseni pismena a s cisly pro navyseni cisla pokud pismeno bude Z.
resim to takto :
$last = 'B12';
echo 'Pismeno '.substr($last,0,1); //zjistim pismeno ale jen s poctem znaku 1 kdyz bude CH tak je to zle
echo 'Cislo '.substr($last,1,5); // a zjistim cislo ale zase jen kdyz bude pocet znaku pismen jedna. S CH je to zase spatne
ale je problem ze kdyz bude pismeno CH tak ma dva znaky a to uz nemuzu nikdy vedet. Nevite nekdo?
<?php
//vrátí pole, kde na indexu 0 je první - písmenná část, na 1 je druhá - číselná (resp. zbytek)
function rozdel($str)
{
$i = 0;
while (ctype_alpha(substr($str, $i++, 1)));
$i--;
return array(
substr($str, 0, $i),
substr($str, $i));
}
vraci mi to jen Array
$str = 'R13';
//vrátí pole, kde na indexu 0 je první - písmenná část, na 1 je druhá - číselná (resp. zbytek)
function rozdel($str)
{
$i = 0;
while (ctype_alpha(substr($str, $i++, 1)));
$i--;
return array(
substr($str, 0, $i),
substr($str, $i));
}
echo rozdel($str);
zkousim to resit:
$ia = 'R13';
$num = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
for($y=0;$y<count($num);$y++):
$vysledek = eregi_replace($num[$y], "", $ia);
endfor;
echo 'cislo'.$vysledek;
kde chci odstarnit cisla a ziskat tak jen pismena ale nejak mi to nechce nic provadet
ches
vraci mi to jen Array
Ne, vrací to pole. "Array" je textová reprezentace pole, pokud ho vypisuješ pomocí echo. Používej var_dump() - http://php.net/var_dump.
Takže:
list($pismeno, $cislo) = rozdel('R13'); //nyní je v $pismeno "R" a v $cislo "13"
list($pismeno, $cislo) = rozdel('CH25'); //nyní je v $pismeno "CH" a v $cislo "25"
Edit: A pokud chceš odstranit z řetežce čísla, tak:
<?php
function bez_cisel($retezec)
{
$bez_cisel = '';
for ($x = 0; ($c = substr($retezec, $x, 1)) !== false; $x++) {
if (!ctype_digit($c)) {
$bez_cisel .= $c;
}
}
return $bez_cisel;
}
//příklad použití:
bez_cisel('A1B2C3'); //vrátí 'ABC'
PS. Doporučuji ti projít si seriál na Linuxsoftu (http://linuxsoft.cz/php).
Díky moc vsem. Mám jeste konzultacni otazku.
Mam DB abeceda:
id/pismenko
1 A1
2 B1
3 C1
.
.
.
7 A2
.
.
a dotazem chci vytahnout nejvyssi pismeno s cislem a vim ze nejvyssi id je i nejvyssi pismenko s cislem. da se dotaz nejak vylepsit ci upravit?
$x = mysql_query('SELECT MAX(id) AS maxid FROM abeceda');
$row = mysql_fetch_assoc($x);
$dotazVrh = mysql_query('SELECT * FROM abeceda WHEREid="'.$row['maxid'].'"');
$vrh = mysql_fetch_array($dotazVrh);
echo 'pismenko a cislo '.$vrh['vrh_nazev'];
Diky moc
Jen skromný dotaz, proč tam potřebuješ i písmeno "ch"? Nějak mi uniká smysl. V anglické abecedě a ASCII "ch" neexistuje a jen si tím při programování komplikuješ život. A kdybys to chtěl řadit podle české abecedy, chybí ti tam ještě č,ď,ň,ř,š,ť,ž.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Morseova abeceda — založil Pól Bulva
Morseova abeceda — založil hejnallukas
Morseova abeceda — založil Montezo
Abeceda pes metody — založil Michal
Permutance reteczu podle abeceda — založil Tony
Moderátoři diskuze