我只想运行我的循环,但是当我尝试这样做时,它失败了。它必须根据循环时发生的迭代次数来增加每个字母,但它根本不需要任何新字母。
为什么会出现这种情况,原因是什么?在 C++ 中,这样的代码可以工作。
function accum('ZpglnRxqenU') {
// your code
$result = '';
$letters_result = '';
$letter_original = '';
$num_if_str = strlen($s);
$j = 0;
for ( $i=0; $i <= $num_if_str; $i++ )
{
$letter_original = substr($s, $i, $i+1);
$j = 0;
while ($j == $i)
{
$letters_result = $letters_result . $letter_original;
$j++;
}
if ($i != strlen($s))
{
$letters_result = $letters_result . '-';
}
}
return $letters_result;
}
它返回:
Z-----------
预期:
Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuuu
这里有很多问题:
$s
但从未初始化它substr()
的调用使用了不正确的返回子字符串长度值$i = $j
时运行,但您将 $j
初始化为 0,因此它仅在 $i
为零时运行,即字符串的第一个字母。有一种更简单的方法可以做到这一点。在 PHP 中,您可以像处理数组元素一样处理字符串中的各个字符,因此不需要
substr()
此外,您可以使用
str_repeat()
生成重复字符串,如果将扩展字符串存储在数组中,则可以使用 implode()
将它们全部连接起来。
最后,组合
ucwords()
和 strtolower()
返回所需的情况。
把它们放在一起我们得到
<?php
$str = "ZpglnRxqenU";
$output = [];
for ($i = 0;$i<strlen($str);$i++) {
$output[] = str_repeat($str[$i], $i+1);
}
$output = ucwords(strtolower(implode('-',$output)),"-");
echo $output; // Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuuu
除了你犯了经典的
while($i<=strlen($s))
差一点的错误之外,我没有更多的内容可以补充@TangentiallyPerpendillary的答案。字符串 bar
的长度为 3,但数组是零索引的 [例如:[ 0 => 'b', 1 => 'a', '2' => 'r' ]
],因此当您在 3 处点击 $i == strlen()
时,这是一个错误。
除此之外,当你的方法被纠正并变得简洁时,它看起来像:
function accum($input) {
$result = '';
for ( $i=0, $len=strlen($input); $i < $len; $i++ ) {
$letter = substr($input, $i, 1);
for( $j=0; $j<=$i; $j++ ) {
$result .= $letter;
}
if($i != $len-1) {
$result .= '-';
}
}
return $result;
}
var_dump(accum('ZpglnRxqenU'));
输出:
string(76) "Z-pp-ggg-llll-nnnnn-RRRRRR-xxxxxxx-qqqqqqqq-eeeeeeeee-nnnnnnnnnn-UUUUUUUUUUU"
还要记住,函数有自己独立的变量作用域,因此您不需要像
$letters_foo
这样的命名空间变量,这可能会让您的代码看起来有点混乱。
对于直接的“字符串输入,字符串输出”功能方法,可以使用
preg_replace_callback()
来分隔和扩展第一个字母之后的每个字母。使用 mb_convert_case()
强制所有分隔字母序列采用标题大小写。
代码:(演示)
var_export(
mb_convert_case(
preg_replace_callback(
'/(?!^)./',
function($m) {
static $i = 1;
return '-' . str_repeat($m[0], ++$i);
},
$input
),
MB_CASE_TITLE
)
);
否则,请使用经典的
for()
循环和 str_repeat()
调用来构建临时数组,然后内爆并应用标题大小写。 演示
$array = [];
for ($i = 0, $length = strlen($input); $i < $length; ++$i) {
$array[] = str_repeat($input[$i], $i + 1);
}
var_export(
mb_convert_case(
implode('-', $array),
MB_CASE_TITLE
)
);