Jak zamienic miejscami co dwa znaki ?

Odpowiedz Nowy wątek
2011-09-27 10:17
0

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 ?

Pozostało 580 znaków

2011-09-27 10:54
1

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


░█░█░█░█░█░█░█░█░█░█░█░
Dzieki troche porzerobilem i jest super - masterO 2011-09-27 11:22

Pozostało 580 znaków

2011-09-27 18:55

ja proponuję taki kod:

$napis = preg_replace('|(.)(.)|', '$2$1', $napis);

głównie dlatego że występują w nim cycki


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 5x, ostatnio: unikalna_nazwa, 2012-03-07 21:46
nie sprawdzałem czy działa, ale cycki mnie przekonują :P - krwq 2011-09-27 19:39
Jednak cycki to cycki :D - masterO 2011-09-28 16:15

Pozostało 580 znaków

2011-09-28 16:26
0

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

edytowany 1x, ostatnio: masterO, 2011-09-28 16:27

Pozostało 580 znaków

2011-09-28 16:41
0

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);
}

Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa, 2011-09-28 17:01

Pozostało 580 znaków

2011-09-28 17:25
0

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 ?

Pozostało 580 znaków

2011-09-28 17:35
0

nie, ale możesz użyć str_split:

foreach(str_split($str, 3) as $kod)
{
    $make_str .= chr($kod - $key);
}

Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
geneialne dzieki musze to przeanalizowac - masterO 2011-09-28 17:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0