Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Java -> PHP (przepisanie kodu)
Forum PHP.pl > Forum > PHP
markonix
Znalazłem pewien kod w JAVIe, który rozwiązuje mój problem.

http://stackoverflow.com/questions/3026263...=active#tab-top

Niestety utknąłem w jego przepisywaniu.

  1. $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. // $str - tutaj nie rozumiem
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < 3)
  11. $result += $alphabet[0];
  12.  
  13. // tej pętli nie rozumiem, co to za "c"? Litera 'c', zmienna $c? Ogólnie dziwna ta pętla?
  14. for ($c : $str)
  15. $result += $alphabet[$chars[strpos($c)]];
  16.  
  17. echo $result .'<br />';
  18.  
  19. }
freemp3
Instrukcja:
Kod
String str = Integer.toString(i, alphabet.length);

rzutuje liczbę w zmiennej i na string, jednak nie dłuższy niż alphabet.length.

Odnośnie pętli jest to odpowiednik foreach, taka konstrukcja w php nie przejdzie. Zmienna str jest rzutowana na tablicę znakową i przy każdym przejściu pętli kolejne elementy są przypisywane do zmiennej c.
Crozin
  1. String str = Integer.toString(i, alphabet.length);
Do zmiennej str zostaje przypisana reprezentacja liczby w systemie liczbowym odpowiadającym długości tablicy alphabet: http://docs.oracle.com/javase/7/docs/api/j...ml#toString(int, int) - w PHP uzyskasz to samo przy pomocy base_convert.

Natomiast pętlę lecącą po każdym znaku mógłbyś utworzyć w ten sposób:
  1. foreach (explode('', $str) as $c) {
  2. // ...
  3. }
markonix
Kod
        final String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

        int wordLength = 3;
        char[] alphabet = { 'a', 'b', 'c' };

        for (int i = 0; i < Math.pow(wordLength, alphabet.length); i++) {

            String str = Integer.toString(i, alphabet.length);

            String result = "";
            while (result.length() + str.length() < wordLength)
                result += alphabet[0];

            for (char c : str.toCharArray())
                result += alphabet[chars.indexOf(c)];

            System.out.println(result);
        }


  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < $wordLength)
  11. $result += $alphabet[0];
  12.  
  13. foreach (explode('', $str) as $c)
  14. $result += $alphabet[strpos($chars, $c)];
  15.  
  16. echo $result .'<br />';
  17.  
  18. }


Takie coś mi wyszło, niestety zapętla się się w jakimś miejscu i wywala.
Crozin
W PHP operatorem łączenia ciągów jest kropka, nie plus, czyli ".=" zamiast "+=" przy zmiennej $result.
markonix
  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8.  
  9. $result = '';
  10. while (strlen($result) + strlen($str) < $wordLength) {
  11. $result .= $alphabet[0];
  12. }
  13.  
  14. foreach ($str as $c)
  15. $result .= $alphabet[strpos($chars, $c)];
  16.  
  17. echo $result .'<br />';
  18. }


Tak, właśnie też to poprawiłem i zapętlenia nie ma choć jeszcze są błędy.

Ok. Wreszcie się udało.

Nie rozdzielał dobrze znaków w tym ostatnim foreach.

  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 3;
  3. $alphabet = array('a', 'b', 'c', 'd');
  4.  
  5. for ($i = 0; $i < pow($wordLength, count($alphabet)); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8. $result = '';
  9. while (strlen($result) + strlen($str) < $wordLength) {
  10. $result .= $alphabet[0];
  11. }
  12.  
  13. foreach (str_split($str) as $c)
  14. $result .= $alphabet[strpos($chars, $c)];
  15.  
  16. echo $result .'<br />';
  17.  
  18. }


Jeszcze jeden edit. Na odwrót potęgi.. Przy większych testach zaczynało się znowu psuć..

Kod prawidłowy:

  1. $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
  2. $wordLength = 2;
  3. $alphabet = array('a', 'b', 'c', 'd', 'e');
  4.  
  5. for ($i = 0; $i < pow(count($alphabet), $wordLength); $i++) {
  6.  
  7. $str = base_convert($i, 10, count($alphabet));
  8. $result = '';
  9.  
  10. while (strlen($result) + strlen($str) < $wordLength) {
  11. $result .= $alphabet[0];
  12. }
  13.  
  14. foreach (str_split($str) as $c)
  15. $result .= $alphabet[strpos($chars, $c)];
  16.  
  17. echo $i .' '. $result .'<br />';
  18.  
  19. }
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.