2017-11-25 113 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中测试它。不知怎的,最后的结果是一个分为两半而不是四个(70个字符)的词条。但是其中一个“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/什么是递归函数在PHP中 - 你的代码有几个错误。 – 1stthomas

+0

你为什么使用爆炸? –

+0

@KshitijKumar函数接收的字符串可以包含多个单词。所以我将字符串转换为单词数组并检查它们中的每一个。 –

回答

0

好吧,我已经解决了它自己。

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()变成字符串。

使用方法breakLongWord与字符串:

SuperDuperExtraGiggaDoubleTrippleSpiSuperDuperExtraGiggaDoubleTrippleSpi 

将返回阵列(具有的var_dump输出()):

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

使用方法breakLongWords与字符串:

SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 SuperDuperExtraGiggaDoubleTrippleSpi1SuperDuperExtraGiggaDoubleTrippleSpi2 testtesttest1234567890 

将生成以下数组(使用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

相关问题