Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]tekst w spak
Woytek950
post 21.10.2010, 19:50:27
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


Witam. Niby to proste a nie mogę rozgryźć jak napisać funkcję która przekształca tekst w spak.
Dla tego proszę o pomoc
Go to the top of the page
+Quote Post
flashdev
post 21.10.2010, 20:00:20
Post #2





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Można pisać, ale po co wymyślać koło na nowo?
http://php.net/manual/pl/function.strrev.php


--------------------
Go to the top of the page
+Quote Post
Woytek950
post 21.10.2010, 20:05:16
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
DeyV
post 21.10.2010, 20:11:47
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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]


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
flashdev
post 21.10.2010, 20:17:09
Post #5





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post
kapuch
post 21.10.2010, 21:34:59
Post #6





Grupa: Zarejestrowani
Postów: 389
Pomógł: 69
Dołączył: 26.04.2010
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Nie chce "Pomógł", aktualna ilość (69) w pełni mnie satysfakcjonuje :)
Go to the top of the page
+Quote Post
skowron-line
post 21.10.2010, 21:41:00
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


  1. $str = 'dupa';
  2. echo join('', array_reverse(str_split('', $str)));

*pisane z palca.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
flashdev
post 21.10.2010, 21:58:05
Post #8





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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ą

Ten post edytował flashdev 21.10.2010, 22:00:00


--------------------
Go to the top of the page
+Quote Post
skowron-line
post 21.10.2010, 22:00:50
Post #9





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
flashdev
post 21.10.2010, 22:03:34
Post #10





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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


--------------------
Go to the top of the page
+Quote Post
skowron-line
post 21.10.2010, 22:12:12
Post #11





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Fifi209
post 21.10.2010, 22:15:26
Post #12





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
flashdev
post 21.10.2010, 22:18:10
Post #13





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.10.2010, 23:17:10
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 21.10.2010, 23:18:24
Go to the top of the page
+Quote Post
flashdev
post 22.10.2010, 21:53:18
Post #15





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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

Ten post edytował flashdev 22.10.2010, 21:53:55


--------------------
Go to the top of the page
+Quote Post
flashdev
post 22.10.2010, 22:14:56
Post #16





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post
kapuch
post 22.10.2010, 22:35:46
Post #17





Grupa: Zarejestrowani
Postów: 389
Pomógł: 69
Dołączył: 26.04.2010
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.

Ten post edytował kapuch 23.10.2010, 01:04:13


--------------------
Nie chce "Pomógł", aktualna ilość (69) w pełni mnie satysfakcjonuje :)
Go to the top of the page
+Quote Post
flashdev
post 23.10.2010, 14:37:25
Post #18





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 9.07.2025 - 19:15