Robbe: Problem mit rekursiver Funktion

Eigentlich müsste diese Fkt bei Aufruf alle Bereiche von $str die von $char eingeschlossen sind, auf ihre Größe hin prüfen, um zu bestimmen ob ein Block die $BL, max. Blocklänge nicht überschreitet.
Leider läuft die Funktion ins leere also auch keine Fehlermeldung, echo liefert bei verwendung in der fkt. nix an den parser zurück.

<pre>
function str_checkBL($char, $str, $BL)
{
 $_str = strstr($str, $char);
 if (!$_str) { return true; }
 else
 {
  if ((strlen($str) - strlen($_str)) > $BL) { return false; } else { str_checkBL($_str, $BL); }
 }
}
</pre>

Gibt es einen Progger der mir da helfen kann?! :]]]]

  1. Huhu Robbe

    function str_checkBL($char, $str, $BL)
    {
     $_str = strstr($str, $char);
     if (!$_str) { return true; }
     else
     {
      if ((strlen($str) - strlen($_str)) > $BL) { return false; } else { str_checkBL($_str, $BL); }
     }
    }

    Hui, das sieht ja durchwachsen aus.
    Deine Funktion hat keinen Rückgabewert.
    Der (rekursive) Funktionsaufruf benutzt weniger und andere Parameter.
    Das Ganze sieht ziemlich sinnfrei aus, da keine Datenmanipulation stattfindet.
    Du solltest es vermeiden mehrere Anweisungen auf eine Zeile zu schreiben.

    Möchtest Du

    a) das Konzept rekursiver Funktionen verstehen ?
    noch ein Beispiel dazu
    http://php-faq.de/q/q-code-verzeichnis.html

    b) ein konkretes Problem/ Aufgabe lösen?

    dann beschreib doch mal, was Du eigentlich machen möchtest und was Du mit Blocklänge meinst, ich vermute mal, das Du mit (nichtfunktionierenden) Kanonen auf Spatzen schiessen möchtest.

    Gibt es einen Progger der mir da helfen kann?! :]]]]

    Was ist das, kann man das essen?

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu Robbe

      Deine Funktion hat keinen Rückgabewert.

      naja, das stimmt nicht ganz.
      Die Funktion liefert true,false oder eben eine Endlosrekursion zurück.
      Also ich korrigiere mich:
      Deine Funktion hat u.U. keinen sinnvollen Rückgabewert.

      Viele Grüße

      lulu

      --
      bythewaythewebsuxgoofflineandenjoytheday
      1. Also ich korrigiere mich:
        Deine Funktion hat u.U. keinen sinnvollen Rückgabewert.

        Hi lulu,

        vielleicht stehe ich auf'm Schlauch, aber viele Testfunktionen liefern lediglich true oder false zurück und das ist durchaus sinnvoll, weil eben etwas getestet werden soll.

        Zum Problem: der rekursive Aufruf ist fehlerhaft! Du hast einen Parameter vergessen! Aber selbst wenn du den Aufruf korrigierst, ist das ganze irgendwie sinnfrei (Ack, lulu).

        Gruß,
        KonRad -

        --
        "Was Gott zusammengeführt hat ..." :: polithink.org -
        the politicultural e-zine :: http://www.polithink.org
        1. Huhu Konrad

          Also ich korrigiere mich:
          Deine Funktion hat u.U. keinen sinnvollen Rückgabewert.

          vielleicht stehe ich auf'm Schlauch, aber viele Testfunktionen liefern lediglich true oder false zurück und das ist durchaus sinnvoll, weil eben etwas getestet werden soll.

          Genau, deshalb steht da ja auch ein "u.U.", also unter Umständen (bei Endlosrekursion).

          Habe mich gestern zunächst zu der Aussage hinreißen lassen, die Funktion habe überhaupt keinen Rückgabewert, weil ich bereits zu lange in die Plastekiste geguckt hatte, und mich daher von der weniger guten Formatierung der Funktion in die Irre führen lies.
          Deshalb kam dann ja noch der "doch sie hat einen" - Nachtrag

          Viele Grüße

          lulu

          --
          bythewaythewebsuxgoofflineandenjoytheday
        2. Danke für eure Antwort!

          Zum Problem: der rekursive Aufruf ist fehlerhaft! Du hast einen >>Parameter vergessen! Aber selbst wenn du den Aufruf korrigierst, >>ist das ganze irgendwie sinnfrei.

          Was ist an diesem Aufruf fehlerhaft? Irgendwo muss ja der Fehler stecken. Ich habe die Fkt. nochma "verbessert", jetzt sieht man wenigsten über echo was diese Fkt. macht: Der Parameter $_str behält beim rek. Aufruf einfach den alten Wert. Testet selbst.

          mfg, RObin.

          function str_checkBL($str, $BL)
          {
           //echo $str."<br>";

          $_str = strstr($str, " ");

          //echo ((strlen ($str) - strlen($_str))-1)."<br>";
           //echo $_str;

          if (!$_str) {
            return TRUE;
           } else if ((strlen ($str) - strlen($_str)) > $BL) { return FALSE; }
             else
             {
              //echo $_str . "<br>\n";
              str_checkBL($_str, $BL);
             }
          }
          $str = "Hallo ich binderkleine Mann undkommausdem Wald!";
          if (str_checkBL($str,10)) { echo $str; }

          1. Problem bei dieser Funktion ist das nach der dem ersten durchlauf die funktion strstr() kein leerzeichen mehr erkennt, obwohl eindeutig einz da is, schaut selbst:
            <?php

            function str_checkBL($str, $BL)
            {
             echo strpos($str, " ")."  ".$BL." :: ".$str."<br>";

            $_str = strstr($str, " ");

            if (!$_str) {
              return TRUE;
             } else if ((strlen ($str) - strlen($_str)) > $BL) { return FALSE; }
               else
               {
                str_checkBL($_str, $BL);
               }
            }
            $str = "Hallo ich binderkleine Mann undkommausdem Wald!";
            if (str_checkBL($str,10)) { echo $str; }

            ?>