2017-11-25 12 views
0

私はPHPを学んでおり、再帰を試してみたかった。私は単語を取得する関数を作っており、その長さが30文字を超える場合は半分に分割します。そして私は再帰を作ったので、もし半分の半分が30単語以上であれば、それも同様にそれを分割します。再帰が期待通りに機能しない

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

var_dump関数を使用してrepl.itでテストしています。何とか最後の結果は、4文字(70文字)の代わりに2つの半分に分割された見出し語です。しかし、 "var_dumps"のいずれかが正しい結果を出力します。

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

この問題を解決してもらえますか?

https://repl.it/repls/SeveralBountifulCub

+0

を使用することができ、この質問に見てみてください。https://stackoverflow.com/questions/2648968/あなたのコードにいくつか間違いがあります。 – 1stthomas

+0

なぜあなたは爆発を使用していますか? –

+0

@KshitijKumar関数のreceiveが複数の単語を含むことができる文字列。だから私は文字列を単語の配列に変換し、それぞれをチェックしています。 –

答えて

0

[OK]を、私はそれを自分で解決しています。

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

結果は、この

SuperDuperExtraGiggaDoubl eTrippleSpicyWithCheese LongUnlimitedString123Su perDuperExtraGiggaDoubl eTrippleSpicyWithCheese LongUnlimitedString123 
0

のように見える私は二つの条件を(言葉を破ると長い単語を破る)混在させる良い方法はないと思います。その代わりに、2つの方法を使用します。

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

どちらの方法は、あなたが簡単にimplode()を使用して文字列になることができ、配列を返します。

SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 testtesttest1234567890 
:文字列でメソッド breakLongWordsを使用

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

SuperDuperExtraGiggaDoubleTrippleSpiSuperDuperExtraGiggaDoubleTrippleSpi 

()は(のvar_dumpで出力)の配列を返します。文字列でメソッドbreakLongWordを使用

次の配列を出力します(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) 

しかし...短い長い話をカットする:この問題のためには、str_split()src

関連する問題