问题打印维数php

问题描述:

我只是PHP的初学者。我正在编写程序来打印如下所示的数字。问题打印维数php

1  1 
12  21 
123 321 
1234 4321 
1234554321 

我写了下面的代码。

<?php 

$n=5; 
for($i=1; $i<=$n; $i++) 
{ 
    echo "<br />"; 
    for($j=1; $j<=$i; $j++) 
    { 
     echo $j; 
    } 
} 

?> 

结果显示如下。

1 
12 
123 
1234 
12345 

我无法扭转它像

1 
    21 
    321 
4321 
54321 

我怎样才能做到这一点?

+0

这功课吗?到目前为止,你做了什么/尝试了什么? – Amadan 2011-12-21 05:42:16

最简单的,硬编码的版本:

<?php 
$text = "1  1 
12  21 
123 321 
1234 4321 
1234554321"; 
echo $text; 
?> 

编辑

一个更通用的解决方案:

<?php 
$n = 5; 
$seq1 = ''; 
$seq2 = ''; 
$format1 = sprintf("%%-%su", $n); //right justified with spaces 
$format2 = sprintf("%%%su", $n); //left justified with spaces 

for($i=1; $i<=$n;$i++){ 
    $seq1 .= $i; 
    $seq2 = strrev($seq1); 
    echo sprintf("$format1$format2\n", $seq1, $seq2); 
}; 
?> 
+0

我为文字解决方案(和一个笑)upvoted,但OP不会学到任何东西:p – Amadan 2011-12-21 05:43:30

+0

谢谢阿马丹,我同意你 - 我现在用'sprintf'写这个版本 – 2011-12-21 05:46:32

+0

我需要逻辑编码不只是通过回声打印 – designersvsoft 2011-12-21 05:46:59

这里是我的问题的解决方案。

这不是最好的解决方案,因为它没有考虑到你可以使用高于9的数字,在这种情况下,它会将数字推到彼此之外。

但重要的是,如果需要的话,它仍然是您可以开展工作的解决方案的开始。

您可以使用array来存储要打印的数字。 因为数字在array这意味着我们可以使用foreach循环来确保打印所有数字。

您可以使用PHP的str_repeat()函数计算出每个数字串之间需要放置多少个空格。 下面的解决方案只有在您使用具有默认数字指示的数组而不是关联数组时才有效。 这是因为它在str_repeat()函数的部分计算中使用了$key变量。 如果您不想使用$key变量,那么您应该能够弄清楚如何改变它。

当它将已经存储在一个字符串中的数字逆转时,您可以使用PHP的strrev()函数来处理该数据并将它们存储在另一个变量中。

最后你只需要在文档末尾打印一个换行符。

请注意,str_repeat()函数正在重复&nbsp;HTML实体。 这是因为浏览器会将正常的空白压缩到1个字符。

另请注意,我已包含style块以将字体更改为monospace。 这是为了确保数字全部与对方排队。

<style> 
    html, body { 
     font: 1em monospace; 
    } 
</style> 
<?php 
$numbers = array(1, 2, 3, 4, 5); 
$numbers_length = count($numbers); 
$print_numbers = ''; 
$print_numbers_rev = ''; 

foreach($numbers as $key => $value) { 
    $spaces = str_repeat('&nbsp;', ($numbers_length - ($key + 1)) * 2); 
    $print_numbers .= $value; 
    $print_numbers_rev = strrev($print_numbers); 

    echo $print_numbers . $spaces . $print_numbers_rev . '<br />'; 
} 

编辑:

解决方案,而不阵列:

<style> 
    html, body { 
     font: 1em monospace; 
    } 
</style> 
<?php 
$numbers = 9; 
$numbers_length = $numbers + 1; 
$print_numbers = ''; 
$print_numbers_rev = ''; 

for($i = 0; $i <= $numbers; ++$i) { 
    $spaces = str_repeat('&nbsp;', ($numbers_length - ($i + 1)) * 2); 
    $print_numbers .= $i; 
    $print_numbers_rev = strrev($print_numbers); 

    echo $print_numbers . $spaces . $print_numbers_rev . '<br />'; 
} 
+0

谢谢。我只是一个初学者。我还没有研究数组的概念。我想知道是否有可能通过仅使用纯循环来实现out数组概念? – designersvsoft 2011-12-21 06:14:15

+0

@designersvsoft只是让你知道我更新了我的答案,以显示你没有数组。它只是从0打印到您输入$ numbers变量的任何数字。要改变它的起点,只需在for循环中更改$ i变量即可。 – 2011-12-21 06:20:30

好。你写的很好。为了做你想做的事情,需要进行一些改变。第一个问题是您将它呈现为HTML - 而HTML不会呈现空格(我们将需要)。两种解决方案:您使用&nbsp;作为空间,并确保使用比例字体,或者将所有内容都包装到<pre>标签中,以实现几乎相同的效果。所以,在echo "<pre>";开头,echo "</pre>";结束。

下一步 - 没有内循环去$i。让它每次都去5,并且如果$j <= $i打印一个数字,否则打印一个空格。

然后,在这个循环的旁边,做另一个,但是反过来(从5开始到1结束),但是做同样的事情。

中提琴是一种乐器。

+0

主要针对中提琴 - 但也是一个很好的解释算法 – 2011-12-21 06:07:53

$n = 5; 

for ($i = 1; $i <= $n; $i++) { 
$counter .= $i; 
$spaces = str_repeat("&nbsp;", ($n-$i)*2); 
echo $counter . $spaces . strrev($counter) . "<br/>"; 
} 

<div style="position:relative;width:100px;height:auto;text-align:right;float:left;"> 
<?php 

$n=5; 
for($i=1; $i<=$n; $i++) 
{ 
    echo "<br />"; 
    for($j=1; $j<=$i; $j++) 
    { 
     echo $j; 
    } 
} 

?> 
</div>