Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]tekst w spak
Forum PHP.pl > Forum > Przedszkole
Woytek950
Witam. Niby to proste a nie mogę rozgryźć jak napisać funkcję która przekształca tekst w spak.
Dla tego proszę o pomoc
flashdev
Można pisać, ale po co wymyślać koło na nowo?
http://php.net/manual/pl/function.strrev.php
Woytek950
Dzięki. no ok ale chciałem poznać tą funkcję bardziej. czyli na jakiej zasadzie działa. bo jeżeli się nie mylę nie każdy język programowania ma taką funkcję.
DeyV
najprościej mówiąc:

- mierzysz długość stringa
- tworzysz pętlę od i = ( długość -1 ) do 0
- - wyświetlasz w pętli $tekst[$i]
flashdev
Cytat(Woytek950 @ 21.10.2010, 21:05:16 ) *
Dzięki. no ok ale chciałem poznać tą funkcję bardziej. czyli na jakiej zasadzie działa. bo jeżeli się nie mylę nie każdy język programowania ma taką funkcję.


  1. <?php
  2.  
  3. function my_strrev($str){
  4. $len = strlen($str);
  5. for( $i = 0; $i < $len>>1; $i++ ){
  6. $temp = $str[$i];
  7. $str[$i] = $str[$len - $i - 1];
  8. $str[$len - $i - 1] = $temp;
  9. }
  10. }
  11.  
  12. echo strrev('kot');
  13.  
  14. fscanf(STDIN, '%s');


To oczywiscie nie zadziała dla polskich znaków, ale widzę że strrev też tak nie zadziała.
kapuch
Cytat(flashdev @ 21.10.2010, 21:17:09 ) *
To oczywiscie nie zadziała dla polskich znaków, ale widzę że strrev też tak nie zadziała.

Zadziala, jak zamiast strlen() uzyjesz mb_strlen() - http://pl.php.net/manual/pl/function.mb-strlen.php
skowron-line
  1. $str = 'dupa';
  2. echo join('', array_reverse(str_split('', $str)));

*pisane z palca.
flashdev
Cytat(kapuch @ 21.10.2010, 22:34:59 ) *
Zadziala, jak zamiast strlen() uzyjesz mb_strlen() - http://pl.php.net/manual/pl/function.mb-strlen.php


Wtedy jeszcze też nie zadziała winksmiley.jpg

Edit:
@skowron-line Twój kod ma znikomą wartość dydaktyczną
skowron-line
Cytat(flashdev @ 21.10.2010, 21:58:05 ) *
@skowron-line Twój kod ma znikomą wartość dydaktyczną

Wiedziałem że dupa nie będzie pasować do tematu.
flashdev
Cytat(skowron-line @ 21.10.2010, 23:00:50 ) *
Wiedziałem że dupa nie będzie pasować do tematu.


Chodziło mi raczej o to, że taki kod nie pokazuje dokładnie jak to działa. Gdybyś pisał tą funkcję w c, czy asemblerze to zrobił byś to w taki sposób jak ja powyżej. Ale oczywiście dodatkowe rozwiązanie tego samego w inny sposób niczemu nie szkodzi. Tymbardziej, że w PHP może być ono nawet szybsze od zaproponowanego przeze mnie winksmiley.jpg
skowron-line
Cytat(flashdev @ 21.10.2010, 22:03:34 ) *
Chodziło mi raczej o to, że taki kod nie pokazuje dokładnie jak to działa. Gdybyś pisał tą funkcję w c, czy asemblerze to zrobił byś to w taki sposób jak ja powyżej. Ale oczywiście dodatkowe rozwiązanie tego samego w inny sposób niczemu nie szkodzi. Tymbardziej, że w PHP może być ono nawet szybsze od zaproponowanego przeze mnie winksmiley.jpg

Bez urazy ale czy w czy to jest forum.php.pl czy forum.c.pl questionmark.gif Nie wydaje mi się żeby twoje rozwiązanie miało sens, po to są takie funkcje jak str_split i array_reverse zeby nie klepać takich cudów.
Fifi209
Cytat(kapuch @ 21.10.2010, 22:34:59 ) *
Zadziala, jak zamiast strlen() uzyjesz mb_strlen() - http://pl.php.net/manual/pl/function.mb-strlen.php

Też nie zadziała. Polskie znaki przetrzymywane są w dwóch bitach o ile mnie pamięć nie zawodzi.
flashdev
Cytat(skowron-line @ 21.10.2010, 23:12:12 ) *
Bez urazy ale czy w czy to jest forum.php.pl czy forum.c.pl questionmark.gif Nie wydaje mi się żeby twoje rozwiązanie miało sens, po to są takie funkcje jak str_split i array_reverse zeby nie klepać takich cudów.


Zacznijmy od tego, że sam klepiesz cuda, bo to co napisałeś przy użyciu 3 funkcji mogłeś zrobić przy użyciu tylko jednej -> strrev.
Zapoznaj się jeszcze raz z trzecim postem tego wątku, to może zrozumiesz co było celem napisania takiego kodu.
Z mojej strony koniec tematu, ponieważ nie mam ochoty na takie dyskusje.
Crozin
Cytat
Dziala dziala, tylko trzeba w drugim argumencie podac jakiego kodowania uzywa strona.
Nadal nie zadziała, ponieważ przy przenoszeniu konkretnych części ciągu:
  1. $str[$i] = $str[$len - $i - 1];
  2. $str[$len - $i - 1] = $temp;
Znaki zapisane w dwóch-trzech bajtach nie zostaną poprawnie przeniesione.

Co do tematu. Tekst jest po prostu inną formą zapisu tablicy liczb. Innymi słowy:
Kod
"ala ma kota" = { 61, 72, 61, 32, 88, 61, 32, 71, 85, 95, 61 }
Tak więc by odwrócić tekst wystarczy tylko odwrócić kolejność elementów w takiej tablicy. Sposób na zrobienie tego pokazał już flashdev w 5. poście.

Wszystko jest fajne, gdy pracujemy w fajnym języku (nie, PHP nie jest fajnym językiem), który wspiera Unikod natywnie. Niestety PHP domyślnie traktuje tekst jako ASCII, a praktycznie cały powstający obecnie kod jest kodowany Unikodem. Problem? ASCII to 2^8 znaków, Unikod to 2^16 znaków, tak więc istnieje mały problem z przechowywaniem zdecydowanej większości znaków Unikodu. By to rozwiązać trzeba czasami jeden znak potraktować tak jakby jako kilka:
Kod
"ałć" = { 61, 81, 122, 64, 188 } # PHP
"ałć" = { 61, 1578, 1422 } # taka na przykład Java

Teraz już problem powinien być widoczny. Spróbujmy odwrócić wyraz "żółw"
Kod
"żółw" = { 15, 44, 62, 212, 79, 11, 78 }
# Co chcemy osiągnąć?
{ 78, 79, 11, 62, 212, 15, 44 }
# Co osiągniemy poprzez proste odwrócenie kolejności elementów w tablicy?
{ 78, 11, 79, 212, 62, 44, 15 }


Tak więc by odwrócić poprawnie ciąg kodowany Unikodem w PHP musimy użyć mb_strlen oraz mb_substr.

PS. Numery dla poszczególnych znaków są przypadkowe.
flashdev
Cytat(kapuch @ 22.10.2010, 22:47:50 ) *
Czlowieku od..fajkuj sie ode mnie i nie ukrywaj swojej niewiedzy atakujac kogos.
Gamoniem jestes i tyle, bo ja tez moge napisac, ze jedyne czego nie dopisalem to funkcji mb_substr i tyle.
Spojrz lepiej o czym ja pisze i nie atakuj.
Bez odbioru.

PS. Dlugo myslales nad odpowiedzia...zabraklo argumentow?


Panie, nie masz Pan racji.
Argumentów brakuje przede wszystkim Tobie w postaci działającego* kodu.
Nikt Cię tutaj nie obraża więc nie widze powodów takiej agresji.

*Edit
flashdev
Napisałem swoją wersję funkcji mb_strrev, żeby zakonczyć te spekulacje nad kodem, którego nie ma.

  1. <?php
  2.  
  3. function mb_strrev($str, $encoding = 'utf-8'){
  4. $len = mb_strlen($str, $encoding);
  5. $res = array();
  6. for( $i = 0; $i < $len; ++$i ){
  7. array_unshift($res, mb_substr($str, $i, 1, $encoding));
  8. }
  9. return implode($res);
  10. }
  11.  
  12. var_dump('Kraków');
  13. var_dump(mb_strrev('Kraków'));
  14.  
  15. fgets(STDIN);


Niezbyt elegancko jest napisany, ale w tej chwili nie udało mi się wymyślić nic lepszego. Jeśli ktoś potrafi to zapraszam do ulepszania tego kodu, zamiast pisać puste, nie poparte argumentami słowa.
kapuch
Cytat(flashdev @ 22.10.2010, 23:14:56 ) *
Niezbyt elegancko jest napisany, ale w tej chwili nie udało mi się wymyślić nic lepszego. Jeśli ktoś potrafi to zapraszam do ulepszania tego kodu, zamiast pisać puste, nie poparte argumentami słowa.

Haha ty zes zaszalal teraz - wszystko Ci Crozin na tacy wylozyl no to trzeba bylo zablysnac...NC.
"Puste, nie poparte argumentami slowa" - to wlasnie twoj skrypt (w szczegolnosi nacisk na PUSTE) w porownaniu do tego, co napisal i wniosl do tematu Crozin.
Rzucasz chlopcze wielkimi slowami, a ja podsumuje cie malymi:

- na poczatku skupiles sie na obrazaniu skowron-line, bo napisal lepsza, prosta i zarazem DZIAŁAJĄCA funkcje (w przeciwienstwie do ciebie), argumentujac to tym iz w jezyku C nie dalo by sie tego tak napisac - choc autor wcale o to nie prosil.
- no i na koniec korzystajac z gotowych rozwiazan, jakie dal Crozin blysnales niczym supernova, funkcja ktora uzywa niepotrzebnego array_unshift - btw. za uzycie podobnych funkcji miales pretensje do skowron-line (cytat: "Zacznijmy od tego, że sam klepiesz cuda, bo to co napisałeś przy użyciu 3 funkcji mogłeś zrobić przy użyciu tylko jednej -> strrev.", to po co uzywasz array(), array_unshift() i implode()? - brak konsekwencji w twoich skryptach i wypowiedziach.
Zeby nie byc "goloslownym" i tak na oslode dla ciebie (cytat: "Argumentów brakuje przede wszystkim Tobie w postaci działającego* kodu.") - no to łykaj:
  1. function my_strrev($str){
  2. $len = mb_strlen($str, 'utf8');
  3. for($i = 0; $i <= $len; $i++ ){
  4. $str_out .= mb_substr($str, $len-$i, 1, 'utf8'); // wlasnie o tym pisalem - zapomnialem o mb_substr();
  5. }
  6. return $str_out;
  7. }
  8. echo my_strrev("gęślą");

Nie umieszczalem tego kodu wczesniej, bo myslalem, ze po poscie Crozina wszystko jest juz jasne - coz...widocznie nie dla ciebie...
To tyle ode mnie.
flashdev
  1. <?php
  2.  
  3. function mb_strrev($str){
  4. return implode(array_reverse(preg_split('/(?<!^)(?!$)/u', $str)));
  5. }
  6.  
  7. var_dump('Kraków');
  8. var_dump(mb_strrev('Kraków'));
  9.  
  10. fgets(STDIN);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.