3 回答
TA贡献1906条经验 获得超10个赞
在与其他答案类似的行上,但这会构建一个带有输出的字符串。这允许它构建循环中的每个重复行并将其添加到结果字符串的开头和结尾。这意味着循环只是运行$n-1时间(加上设置中间线的第一行)......
$n=4;
$output = str_repeat("$n", (2*$n)-1).PHP_EOL;
for ( $i = $n-1; $i>0; $i-- ) {
$line = str_repeat(' ', $n-$i).str_repeat("$i", (2*$i)-1);
$output = $line.PHP_EOL.$output.$line.PHP_EOL;
}
echo $output;
TA贡献1830条经验 获得超3个赞
您可以通过注意最长的线是具有最大值 n 的线来解决此问题,并且其中包含2*n-1n。所有其他行都需要间距以使它们与那一行对齐,这将是该行上的 n 数与最长行上的 n 数之差的一半。str_repeat是生成那些重复字符串的好方法:
echo "<pre>\n";
$n=4;
$max_length = $n * 2 - 1;
for ($i = 1; $i <= $n * 2 - 1; $i++) {
$this_n = ($i <= $n) ? $i : $n * 2 - $i;
$num_ns = $this_n * 2 - 1;
echo str_repeat(' ', ($max_length - $num_ns) / 2);
echo str_repeat("$this_n", $num_ns);
echo "\n";
}
echo '</pre>';
输出:
<pre>
1
222
33333
4444444
33333
222
1
</pre>
TA贡献1807条经验 获得超9个赞
两个 for 循环,重复所需的空格数和字符数。
$n = 4;
for($i=1;$i<=$n;$i++){
echo str_repeat(" ", $n-$i+1) . str_repeat($i, $i*2-1) . "\n";
}
for($i=$n-1;$i>0;$i--){
echo str_repeat(" ", $n-$i+1) . str_repeat($i, $i*2-1) . "\n";
}
https://3v4l.org/1hK3s
- 3 回答
- 0 关注
- 186 浏览
添加回答
举报