递归不能按预期工作

时间:2017-11-25 15:50:08

标签: php recursion

我正在学习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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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