我正在学习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"
你能帮我解决这个问题吗?
答案 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)