复杂的星形图案?

时间:2013-04-24 22:28:24

标签: php web-applications for-loop

好的,所以我在尝试编写5x3星形模式时遇到了一个独特的问题。我可以做for循环来获得5x3,这很容易。但是我需要一些不同于正方形的东西。

我们最多可以有15颗星。所以打印出一个完整的块看起来像这样:

* * *
* * *
* * *
* * *
* * *

但是我们可以传递一个参数来表示我们想要的星数。所以让我们传入11而不是15.我们应该得到:

* * *
* * *
* * *
* *

但是,以11作为我的参数,输出如下:

* 
* *
* *
*

打印出具有错误星数的正确行数。我知道为什么会这样,这是因为我的代码中的模数。我也尝试了一种不同的方法,打印出的行数少于所需数量。我被困住了,不知道从哪里开始。

这是我的代码:

<?php
    $num = 11;
    $rows = ceil($num/3);
    $count - 0;
    for($j = 0; $j < $rows; $j++){
        echo '<div class="row-fluid"><ul class="thumbnails">';
        for($i = $num%3; $i < 3; $i++){
            echo '*';
            $count++;
        }
        $num-=$count;
        echo '</ul></div>';
     }
?>

5 个答案:

答案 0 :(得分:0)

使用一些简单的PHP-Fu:

$stars = 11;
$row_length = 3;


$array = array_fill(0, $stars, '*');
$array = array_chunk($array, $row_length);

$table = '<table border="0">';
foreach($array as $row){
    $table .= '<tr><td>'. implode('</td><td>', $row) .'</td></tr>';
}
$table .= '</table>';

echo $table;

Online demo

答案 1 :(得分:0)

为了实现这一点,这就是你需要的。

$num = 11;
$cols = 3;
$rows = ceil($num/$cols);

for($j=0;$j<$rows;$j++)
    echo "<div class='row'>";
    for($i=0;$i<$cols;$i++){
        echo "*";
    }
    echo "</div>";
}

显示代码中出错的位置。首先,您对$ count的定义应该是=而不是-。接下来,您的内部for循环是奇数。

首次循环,$num等于11。在内部循环中设置$i = $num%3 $i = 2。所以内部循环在$i++ < 3时运行一次,回显的是一个星,并且增量计数一次。内部循环退出,您从$count中减去$num,使$num=10和行完成,下一次外循环迭代。

下次内循环运行时,$num为10,因此$i = $num%3变为$i=1。内循环在$i++ < 3运行2次,回显2个星并且增加$ count两次使它现在变为3.在内循环之后你从$num减去3个以使其成为7并且行结束,外循环继续。

下一个内循环,$num为7,因此$i = $num%3变为$i=1。内循环在$i++ < 3运行2次,回显2个星并且两次增加$ count使其成为现在5.在内循环之后从$num减去5使其现在为2,行结束,外循环继续。

外部循环的最后一次迭代(行限制命中),$num为2,因此$i = $num%3变为$i=1。内循环运行一次,回声的一个星和内部计数一旦现在成为8.内循环结束,你从$num中减去8,使其现在为-6,行结束,外循环结束。

答案 2 :(得分:0)

这个想法应该很简单:继续绘图直到达到目标数字。

所以你可以这样做:

$num = 11;
for( $i=0; $i<$num; $i+=3) {
    echo "<div class=\"row-fluid\"><ul class=\"thumbnails\">";
    for( $j=0; $j<3 && $i+$j<$num; $j++) {
        echo "*";
    }
    for( ; $j<3; $j++) { // finish the current row (optional, remove if not needed)
        echo " ";
    }
    echo "</ul></div>";
}

答案 3 :(得分:0)

哦,一个谜题!

我不知道使用for是否是您的作业要求,我更喜欢while

 $num_of_stars = 15;
 $stars_per_row = 3;
 while($num_of_stars > 0){
    echo "*";
    if($stars_per_row == 1){
        $stars_per_row = 3;
        echo "<br />";
    }else{
        $stars_per_row --;
    }
    $num_of_stars --;
 }

答案 4 :(得分:0)

我不明白为什么你必须使用两个for循环。

我会做这样的事情:(我注意到你的代码中没有<li>个)当然你必须设置class =“缩略图”以包含list-style-type :无;

<?php
    $num = 11;
    $cols = 3;

    echo '<div class="row-fluid"><ul class="thumbnails">';
    $count = 0;
    for($j = 0; $j < $num; $j++){
        $count++;

        echo '<li style="float:left;">*</li>';
        if ($count>=$cols) {
            $count = 0;
            echo '<li style="clear:both;"></li>';
        }

     }
     echo '</ul></div>';
?>