PHP级联文本函数cascade开发问题:输出不符合预期
修正cascade函数实现
你的当前代码逻辑错误,它将每个单词的字符单独纵向输出后拼接,而实际需要把所有单词的对应行字符按指定间隔对齐,共同组成每一行。以下是修正后的代码:
function cascade(string $s, int $gap): string { $words = explode(' ', $s); $lines = []; // 计算每个单词的起始列位置 $startPositions = []; $currentStart = 0; foreach ($words as $word) { $startPositions[] = $currentStart; $currentStart += 1 + $gap; // 字符占1位 + 指定间隔 } // 找到最长单词的长度,确定总行数 $maxWordLength = max(array_map('strlen', $words)); // 计算每行的总长度(最后一个单词的最后一个字符的位置 +1) $lineLength = $startPositions[array_key_last($startPositions)] + $maxWordLength; // 构建每一行 for ($lineNum = 0; $lineNum < $maxWordLength; $lineNum++) { // 初始化当前行为全下划线 $currentLine = array_fill(0, $lineLength, '_'); foreach ($words as $wordIndex => $word) { // 如果当前单词有对应行的字符 if ($lineNum < strlen($word)) { $charPosition = $startPositions[$wordIndex] + $lineNum; $currentLine[$charPosition] = $word[$lineNum]; } } // 拼接成字符串并加入结果 $lines[] = implode('', $currentLine); } return implode(PHP_EOL, $lines); }
代码逻辑说明
- 计算单词起始位置:遍历所有单词,确定每个单词的第一个字符在第一行的起始列,后续每个单词的起始位置 = 前一个单词起始位置 + 1(字符占位) + 指定间隔
gap。 - 确定总行数和行长度:总行数由最长单词的长度决定;每行的总长度是最后一个单词的最后一个字符的位置(起始位置 + 最长单词长度 -1)加1,确保能容纳所有字符和下划线。
- 逐行构建内容:
- 先将当前行填充为全下划线;
- 遍历每个单词,如果当前行号在单词的字符范围内,就将对应字符放到计算好的位置上;
- 拼接字符数组为字符串,加入结果集合。
测试示例1:cascade("The codings bug", 2),输出与预期一致:
T__c__b___ _h__o__u__ __e__d__g_ ______i___ _______n__ ________g_ _________s
测试示例2:cascade("The coding bug", 3),输出与预期一致:
T___c___b__ _h___o___u_ __e___d___g _______i___ ________n__ _________g_
内容的提问来源于stack exchange,提问作者MSalah
相关产品推荐
相关产品推荐

