Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla for 'nie startuje'
Forum PHP.pl > Forum > Przedszkole
bangoo
  1. <?php
  2. function assign ($word, $keystr){
  3.    $wordLen = strlen($word);
  4.    for($i = 0, $a = 0; $a == $wordLen; $i++, $a++){
  5.        echo $i;
  6.        $arrKey[$a] = $keystr[$i];
  7.        if($i == wordLen){
  8.            $i = 0;
  9.        }
  10.    }
  11.    return $arrKey;
  12. }
  13. ?>

Funkcja ma tworzyć tablicę $arrKey o ilości kluczy odpowiadającej ilości znaków w $word o powtarzajacych sie wartosciach zmiennej $keystr. np. $word = "pies" - 4 znaki. a $keystr = "fr" więc $arrKey[] = "f" "r" "f" "r"
Z pewnego dziwnego powodu pętla nie jest wykonywana.
Proszę o pomoc i z góry dziękuję.
Puzi
Popatrz na to:
  1. <?php
  2. for( inicjalizacja zmiennych ; sprawdzenie warunku ; modyfikacja zmiennych) {
  3.  
  4. blok wyrażeń
  5.  
  6. }
  7. ?>



a na swoją pętlę... i czym się różni??
bangoo
Może jestem ślepy, ale nie widzę różnicy...
erix
Cytat
  1. <?php
  2. for($i = 0, $a = 0; $a == $wordLen; $i++, $a++){
  3. ?>
  • masz dwie zmienne
  • warunek masz "równy", a nie większe/mniejsze, etc.

Poza tym, niepotrzebna jest Ci zmienna $i, gdyż wg Twoich założeń ma taką samą wartość, co $a. winksmiley.jpg
bangoo
Zgodnie z dokumentacją mogę zainicjować dwie zmienne. A obie są potrzebne, lecz tu jest błąd, bo w instrukcji warunkowej wewnątrz pętli nie powinno być
Kod
$i == wordLen

ale
Kod
$i == strlen($keystr)

Cytat
warunek masz "równy", a nie większe/mniejsze, etc

No ale "==" to też operator porównania, więc tutaj nie ma błędu.
erix
Cytat
Zgodnie z dokumentacją mogę zainicjować dwie zmienne.

Zgadza się, mój błąd, nie zauważyłem.

Cytat
No ale "==" to też operator warunkowy, więc tutaj nie ma błędu.

To dlaczego Ci pętla nie działa? tongue.gif

Dla wyrażeń bool stosuj do" title="Zobacz w manualu PHP" target="_manual/while" title="Zobacz w manualu PHP" target="_manual + ew. licznik.
bangoo
Ja może wstawię cały kod programu.
  1. <?php
  2. $arr = Array(
  3.            "A", "B", "C", "D", "E", "F", "G", "H",
  4.            "I", "J", "K", "L", "M", "N", "O", "P",
  5.            "Q", "R", "S", "T", "U", "V", "W", "X",
  6.            "Z", "0", "1", "2", "3", "4", "5", "6",
  7.            "7", "8", "9");  //tablica znakow
  8.  
  9. function getKey ($char){
  10.    global $arr;
  11.    foreach($arr as $key => $value){
  12.        if ($value == $char){
  13.            return $key;
  14.        }
  15.    }
  16. }
  17.  
  18. function assign ($word, $keystr){
  19.    $wordLen = strlen($word);
  20.    for ($i = 0, $a = 0; $a > $wordLen; $i++, $a++){
  21.        $arrKey[$a] = $keystr[$i];
  22.        if($i == strlen($keystr)){
  23.            $i = 0;
  24.        }
  25.    }
  26.    return $arrKey;
  27. }
  28.  
  29. function encodeChar ($charKey, $keyKey) {
  30.    global $arr;
  31.    $offset = getKey($keyKey);
  32.    foreach($arr as $key => $value){
  33.        if ($value == $charKey){
  34.            $charKey = $key + $offset;
  35.            break;
  36.        }
  37.    }
  38.    if ($charKey > 35){
  39.    $charKey %= $offset;
  40.    }
  41.    return $arr[$charKey];
  42. }
  43.  
  44. function encodeWord ($word, $keyword){
  45.    strtoupper($word);
  46.    strtoupper($keyword);
  47.    $arrKey = assign($word, $keyword);
  48.    $wordLen = strlen($word);
  49.    for($i = 0; $i == $wordLen; $i++){
  50.        $encode[$i] = encodeChar($word[$i], $arrKey[$i]);
  51.    }
  52.    return $encode;
  53. }
  54. $test = encodeWord('cejrowski', 'abc');
  55.  
  56. print_r($test);
  57. ?>

Cytat
Dla wyrażeń bool stosuj do/while + ew. licznik.

Ale to na przyszłość, bo tutaj nie ma bool winksmiley.jpg
erix
Cytat
Ale to na przyszłość, bo tutaj nie ma bool

:
Cytat
  1. <?php
  2. $a == $wordLen
  3. ?>


To zawsze zwróci Ci bool. winksmiley.jpg A w for" title="Zobacz w manualu PHP" target="_manual musisz jako drugi parametr wskazać tą wartość, do której ma zmierzać licznik; to tak, jakbyś definiował ciąg/zbiór:

  1. <?php
  2. for($a=0;$a<1000;$a++)
  3. ?>


Masz zbiór (0;1000) ze skokiem o jeden. Jeśli zrobisz nieodpowiedni warunek, to otrzymasz po prostu pętlę nieskończoną.
vokiel
W porządku, że możesz zainicjować 2 zmienne, tylko w Twoim przypadku to nie ma żadnego sensu, po co Ci 2 zmienne, skoro startują z tą samą liczbą początkową i są zmieniane o ten sam skok.
  1. <?php
  2. for ($i = 0, $a = 0; $a > $wordLen; $i++, $a++){
  3. // tutaj zawsze $i==$a to po co Ci 2 zmienne
  4. }
  5. ?>
erix
Nie $a > $wordLen, tylko $a < $wordLen jak już. winksmiley.jpg

Wg Twojej definicji pętla się wcale nie wykona, bo jest to sprzeczność. winksmiley.jpg
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.