mam string np
$napis = "raz dwa"
I chcialbym zamienic co dwa znaki ze soba zeby bylo
$napis = "ar zwda"
Jesli jest nieparzysta ilosc to ma odcinac ostatni znak i zamienic tylko te parzyste
a jesli jest parzysta ma zamieniac wszystko
Jk to zrobic w jednej petli ? da sie ?
coś namieszałeś z tym odcinaniem, bo w przykładzie który podałeś jest 7 znaków i w odpowiedzi również 7.
pewnie coś takiego będzie (nie sprawdzane):
$dl =floor(strlen($napis)/2)*2; // dzieki takiemu zapisowi dlugosc bedzie parzysta
for ($i=0; $i<$dl; $i+=2)
{
$tmp = $napis[$i];
$napis[$i] = $napis[$i+1];
$napis[$i+1] = $tmp;
}
pewnie da się jakoś szybciej, ale dla krótkich tekstów nie powinno mieć to znaczenia
ja proponuję taki kod:
$napis = preg_replace('|(.)(.)|', '$2$1', $napis);
głównie dlatego że występują w nim cycki
A to czy taki kod na przyklad tez mozna zamienic na jedna linijke z uzyciem preg_replace ?
for($i = 0; $i <= $length - 1; $i++) {
$number = ord($mix_str[$i]) + $key;
if (strlen($number) < 3) { $number = "0".$number; }
$result .= $number;
}
Generalnie odczytujmey znak , zamieniamy na kod ascii , jesli kod ma dwa znaki doklejamy 0 i idziemy do kolejnego znaku
no raczej nie
chyba że takie naciąganie:
$result = preg_replace_callback('/./', function($q) { return str_pad(ord($q[0]) + $key, 3, '0', STR_PAD_LEFT); }, $mix_str);
(dla php < 5.3.0 z użyciem "create_function")
z tym że "$key" nie będzie widoczne w tym miejscu i trzeba by było albo podmienić na $GLOBALS['key'] (nie zalecane), albo podmienić na stałą, albo na odwołanie do własności klasy
ale to bez sensu - a tak poważnie to możesz po prostu skrócić ten kod do:
for($i = 0; $i < $length; $i ++)
{
$result .= str_pad(ord($mix_str[$i]) + $key, 3, 0, STR_PAD_LEFT);
}
Mam jeszcze ostatnie pytanie bo teraz jak chce odwrocci proces i mam kod
for($i = 0; $i < $length; $i++) {
$make_str .= chr((substr($str, $k, 3) - $key));
$k = $k + 3;
//$make_str .= str_pad(chr($str - $key), 3, 0, STR_PAD_LEFT);
}
Ale jak odkomentuje ten kod to mam same 0 bo w tym stringu $str mamy ciag znakow taki:
065066067
i trzeba je podzielic po 3 cyfry i odmienic to ta funkcja str pad tez by byla do tego dobra ?
nie, ale możesz użyć str_split:
foreach(str_split($str, 3) as $kod)
{
$make_str .= chr($kod - $key);
}