2017-11-25 15 views
0

Ich lerne PHP und wollte Rekursion ausprobieren. Ich habe eine Funktion gemacht, die ein Wort bekommt, und wenn ihre Länge mehr als 30 Zeichen beträgt, teilt sie sie in zwei Hälften. Und ich habe eine Rekursion gemacht, also wenn eine von einer Hälfte über 30 Wörter ist, teilt sie es auch und so weiter.Rekursion funktioniert nicht wie erwartet

function breakLongWords($val) { 
    $array = explode(" ", $val); 

    foreach ($array as $key => $word) { 
     if (strlen($word) > 30) { 

      for ($i = strlen($word) + 1; $i >= round(strlen($word)/2); $i--) { 
       $word[$i+1] = $word[$i]; 
       if ($i == round(strlen($word)/2)) { 
        $word[$i] = " "; 
       } 
      } 

      breakLongWords($word); 
      $array[$key] = $word; 
     } 

     $result = implode(" ", $array); 
    } 

    var_dump($result); 
} 

$str = "SuperDuperExtraGiggaDoubleTrippleSpicyWithCheeseLongUnlimitedString123"; 
breakLongWords($str); 

Ich teste es in repl.it mit var_dump Funktion aus. Irgendwie ist das letzte Ergebnis ein Eintragswort, das in zwei anstatt vier Hälften geteilt ist (70 Zeichen). Eine der "var_dumps" druckt jedoch das korrekte Ergebnis.

string(37) "SuperDuperExtraGigg aDoubleTrippleSpi" 
string(35) "cyWithCheeseLongUn limitedString123" 
string(73) "SuperDuperExtraGigg aDoubleTrippleSpi cyWithCheeseLongUn limitedString123" 
string(71) "SuperDuperExtraGiggaDoubleTrippleSpi cyWithCheeseLongUnlimitedString123" 

Können Sie mir bitte helfen, dieses Problem zu lösen?

https://repl.it/repls/SeveralBountifulCub

+0

Bitte werfen Sie einen Blick auf diese Frage verwenden: https://stackoverflow.com/questions/2648968/ Was ist eine rekursive Funktion in PHP? Sie haben mehrere Fehler in Ihrem Code. – 1stthomas

+0

Warum verwenden Sie explodieren? –

+0

@KshitijKumar String, den die Funktion empfängt, kann mehr als ein Wort enthalten. Also konvertiere ich String zu Array von Wörtern und überprüfe jeden von ihnen. –

Antwort

0

Ok, habe ich es selbst gelöst.

function breakLongWords($val) { 
    $array = explode(" ", $val); 

    foreach ($array as $key => $word) { 
     if (strlen($word) > 30) { 

      for ($i = strlen($word) + 1; $i >= round(strlen($word)/2); $i--) { 
       $word[$i+1] = $word[$i]; 
       if ($i == round(strlen($word)/2)) { 
        $word[$i] = " "; 
       } 
      } 

      $array[$key] = breakLongWords($word); 
     } 

     $result = implode(" ", $array); 
    } 

    return $result; 
} 

$str = "SuperDuperExtraGiggaDoubleTrippleSpicyWithCheeseLongUnlimitedString123SuperDuperExtraGiggaDoubleTrippleSpicyWithCheeseLongUnlimitedString123"; 

echo breakLongWords($str); 

Das Ergebnis sieht wie folgt aus

SuperDuperExtraGiggaDoubl eTrippleSpicyWithCheese LongUnlimitedString123Su perDuperExtraGiggaDoubl eTrippleSpicyWithCheese LongUnlimitedString123 
0

ich denke, es ist kein guter Ansatz ist es, die beiden Bedingungen (brechen Worte und ein langes Wort zu brechen) zu mischen. Dafür stattdessen 2 Methoden:

function breakLongWord($str, $arr = [], $limit = 30) { 
    $arr[] = substr($str, 0, $limit); 
    $rest = substr($str, $limit); 
    if (strlen($rest)) { 
     $arr = breakLongWord($rest, $arr); 
    } 
    return $arr; 
} 
function breakLongWords($str) { 
    $words = explode(" ", $str); 
    $arr = []; 
    foreach ($words as $word) { 
     $arr[] = breakLongWord($word); 
    } 
    return $arr; 
} 

Beiden Methoden geben einen Array zurück, die Sie einfach in Strings mithilfe der implode() drehen können.

die Methode breakLongWord mit der Zeichenfolge mit:

SuperDuperExtraGiggaDoubleTrippleSpiSuperDuperExtraGiggaDoubleTrippleSpi 

das Array zurück (Ausgang mit var_dump()):

array (size=3) 
    0 => string 'SuperDuperExtraGiggaDoubleTrip' (length=30) 
    1 => string 'pleSpiSuperDuperExtraGiggaDoub' (length=30) 
    2 => string 'leTrippleSpi' (length=12) 

die Methode breakLongWords mit der Zeichenfolge mit:

SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 testtesttest1234567890 

Erzeugt folgendes Array (Ausgabe mit var_dump()):

array (size=3) 
    0 => 
    array (size=3) 
     0 => string 'SuperDuperExtraGiggaDoubleTrip' (length=30) 
     1 => string 'pleSpi1SuperDuperExtraGiggaDou' (length=30) 
     2 => string 'bleTrippleSpi2' (length=14) 
    1 => 
    array (size=3) 
     0 => string 'SuperDuperExtraGiggaDoubleTrip' (length=30) 
     1 => string 'pleSpi1SuperDuperExtraGiggaDou' (length=30) 
     2 => string 'bleTrippleSpi2' (length=14) 
    2 => 
    array (size=1) 
     0 => string 'testtesttest1234567890' (length=22) 

Aber .. Um eine lange Geschichte kurz machen: Für dieses Problem könnte man str_split() (src)

Verwandte Themen