坚持使用 PHP 中的数字模式打印

Posted

技术标签:

【中文标题】坚持使用 PHP 中的数字模式打印【英文标题】:Stuck with the number pattern printing in PHP 【发布时间】:2012-08-16 11:25:02 【问题描述】:

卡在数字模式打印逻辑上。让我知道我做错了什么,因为我的文件只是继续执行而没有给我一个模式。

我的代码--

<?php

$num = 4;

for( $j=1 ; $j <= $num ; $j++ )

    for( $i=$j ; $i < $num-1 ; $i++ )
    
    echo "&nbsp;";
    

    for( $j ; $j >= 1 ; $j-- )
    
    echo $j."&nbsp;";
    

echo "<br />";

要实现的模式--

   1
  21
 321
4321

更新

应用新更改后,以下是屏幕截图 ---

【问题讨论】:

请指定我在我的代码中出现的逻辑错误 【参考方案1】:
for ($i = 1; $i <= 4; $i++) 
  echo str_pad(implode('', range($i, 1)), 4, ' ', STR_PAD_LEFT) . '<br />';

使用 CSS 右对齐

echo '<div style="text-align:right;">';
for ($i = 1; $i <= 4; $i++) 
  echo implode('', range($i, 1)) . '<br />';

echo '</div>';

【讨论】:

+1 for str_pad 方法,你能告诉我上面的代码有什么问题吗..帮助我建立我的逻辑:) 我猜这是因为您使用$j 进行外部和第二个内部循环。 我不认为会导致他的期望。 @MihaiIorga 你是对的,它没有按正确的顺序打印检查我更新的帖子 @swapnesh 它们放置正确,但我猜你在浏览器中执行它?根据这有什么好处,我推荐text-align-css-property,但你也可以str_replace(' ', '$nbsp;', $string)(如果你愿意,但对齐不是固定长度空格的用途)。【参考方案2】:

你的错误在最后一个for,因为你已经在循环,所以不应该存在。

并创建一个新变量,它将保存下一个增量的打印文本。

<?php

$num = 4;
$wrap = '';

for( $j=1 ; $j <= $num ; $j++ )

    for( $i=$j ; $i < $num ; $i++ )
    
        echo "&nbsp; ";
    

    echo $wrap = $j.$wrap;
    echo "<br />";

?>

【讨论】:

@MihaiLorga 请检查我更新后的截图和截图..空格放置不正确 - @MihaiLorga 真棒它的工作..但如何大声笑???空格到底有什么问题??? NBSP 代表No-break space.&amp;nbsp; + (space) 是关键 @Mihailorga 感谢您提供的所有信息 ..really g8 :)【参考方案3】:

根本原因是浏览器不会只渲染第一个空格,您可以通过使用不间断空格 html 实体 &amp;nbsp 代替空格来克服这个问题。

Soooo,如果您希望您的实际模式看起来像:

   1
  21
 321
4321

而不喜欢:

1
21
321
4321

使用&amp;nbsp(编辑:实际上使用&amp;nbsp;[space],因为只有1 似乎无法补偿1 字符与4 的宽度)

<?php 
    $num = 4;
    $result = array();
    foreach(range($num,1) as $i)
        $result[] = str_repeat('&nbsp; ',$num-$i).implode('',range($i,1)).'<br />';
    
    echo implode('',array_reverse($result));
?>

或者您可以使用&lt;pre&gt; 标签,例如:

<?php 
$num = 4;
$result = array();
foreach(range($num,1) as $i)
    $result[] = str_repeat(' ',$num-$i).implode('',range($i,1)).PHP_EOL;

echo '<pre>'.implode('',array_reverse($result)).'</pre>';
?>

【讨论】:

哇 .. 你居然在你的 HTML 应用程序中添加了&lt;pre&gt; 标签? @LawrenceCherone..它的工作原理是空格的问题??? 应该是str_repeat('&amp;nbsp; ',$num-$i),带有空格。你没有回答他的问题。 Kindly specify the logical error im doing in my code【参考方案4】:

就目前而言,问题在于您的第三个(或第二个嵌套)for 循环。

您不能在这里只重用$j 作为计数器,因为$j 仍然在包含for 循环中被积极使用。将 for 循环替换为:

for( $k = $j ; $k >= 1 ; $k-- )

    echo $k."&nbsp;";

【讨论】:

请检查我更新后的帖子截图..空格放置不正确【参考方案5】:

这是你的程序的代码,你可以去Develepor hell了解更多这样的模式

// 外寻找换行

对于 ($i = 1; $i

// Loop added for spacing
for ($s = $i; $s<=10-$i; $s++) 
    echo "&nbsp;";
    

// Inner loop for printing required pattern
for ($j = $i; $j>=1; $j--) 
    echo $j;


echo '</br>';

【讨论】:

【参考方案6】:
// Here is the code for your program,
// Pattern - 1

$num = 4;

// to print no. of rows
for( $i=1 ; $i <= $num ; $i++ )


    
    // To print white space
    for( $j=1 ; $j <= $num-$i ; $j++ )
    
        echo "0";
    
    
    // To print pattern
    for( $z= $i ; $z>=1 ; $z-- )
    
        
        echo $z;
    
    
    
    // To print new line
    echo "<br />";


==>> Output
0001
0021
0321
4321

//===================================================================//

Pattern - 2

$z=1;
$n=3;

# no of rows
for($i=1;$i<=$n;$i++)

# to check even or odd
if($i%2 == 0)

    # main logic to display in reverse order // right to left
    $z = ($z+$n) -1;

    $a = $z;
    for($j=1;$j<=$n;$j++)
    
        echo $z--;
    

    $z = $a+1;



else

    # display data left to right

    for($j=1;$j<=$n;$j++)
    
        echo $z++;
    


echo "<br/>";



==>> Output
123
654
789 

【讨论】:

代码太多了!有没有机会加一段来解释这段代码?【参考方案7】:

您的问题似乎是您将输出打印到 HTML 文档中,该文档将多个空格作为其默认行为。请参阅“Why does HTML require that multiple spaces show up as a single space in the browser?”要在打印时“保留”空格,请使用 &lt;pre&gt; 标记。

我将添加一个基于数学的解决方案,而不是多个迭代函数调用和多个循环(受my explained answer here 启发)。一旦你的数量限制高于 9,我不知道我的输出是否会与你想要的输出一致。

实际上,我使用printf() 将每一行用空格填充到相同的最大长度。每个连续的数字都会打印与其值一样多次的整数。

代码:(Demo)

$num = 4;
echo "<pre>";
for ($i = 1; $i <= $num; ++$i) 
    printf("% $numd<br>", (10 ** $i - 1) / 9 * $i);

HTML 输出(点击演示链接中的眼睛图标切换到 HTML 模式):

   1
  22
 333
4444

为了比较,这些也可以在 for() 循环内工作(并提供高于 9 的更直观的结果):

printf("% $numd<br>", str_repeat($i, $i));

或者

echo str_repeat(' ', $num - $i) . str_repeat($i, $i) . "<br>";

【讨论】:

以上是关于坚持使用 PHP 中的数字模式打印的主要内容,如果未能解决你的问题,请参考以下文章

用最少的 for 循环创建数字模式

使用 php GD 库的模式文本

C程序打印直角三角形

PHP的设计模式之工厂模式

构建三角形数字模式PHP

非常简单地使用装饰器模式生成数字