在字符串中的每个字符之间插入分隔符,并使用递增计数器重复每个字母

问题描述 投票:0回答:3

我只想运行我的循环,但是当我尝试这样做时,它失败了。它必须根据循环时发生的迭代次数来增加每个字母,但它根本不需要任何新字母。

为什么会出现这种情况,原因是什么?在 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
php string loops repeat delimited
3个回答
2
投票

这里有很多问题:

  • 您正在使用
    $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

演示:https://3v4l.org/OoukZ


0
投票

除了你犯了经典的

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
这样的命名空间变量,这可能会让您的代码看起来有点混乱。


0
投票

对于直接的“字符串输入,字符串输出”功能方法,可以使用

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
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.