<?php
//打印空心菱形
$n=8;
for($i=1;$i<=2*$n-1;$i++){//外层for控制金字塔的层数
//在打印*前先打印空格
if($i<=$n){
for($k=1;$k<=$n+1-$i;$k++){
echo "&nbsp";
}

for($j=1;$j<=2*$i-1;$j++){//能内层for控制每层*的个数
if($i==1){
echo '*';
}else{
if($j==1||$j==2*$i-1){
echo '*';
}else{
echo '&nbsp';
}
}
}
}else{
for($k=1;$k<=$i-$n;$k++){
echo '&nbsp';
}
for($j=1;$j<=2*(2*$n-$i)-1;$j++){
if($i=2*$n-1){
echo '*';
}else{
if($j==1||$j==2*(2*$n-$i)-1){
echo '*';
}else{
echo '&nbsp';
}
}
}
}
echo '<br/>';
}

?>
输出结果为为什么会这样????看了半天也不明白,求大神解释!

解决方案 »

  1.   

    我也是没看懂那堆代码...还是自己写了一个清晰点的<?phpfunction print_diamond($line, $flag = '*', $space = '&nbsp;', $end = '<br />') {
    $diamond = make_diamond_array($line);
    $total = $line * 2 - 1;
    for($i = 1; $i <= $total; $i++) {
    for($j = 1; $j <= $total; $j++) {
    if($diamond[$i][$j]) {
    echo $flag;
    }else{
    echo $space;
    }
    }
    echo $end;
    }
    }function make_diamond_array($line) {
    $line = intval($line);
    $diamond = array();
    for($i = 1; $i <= $line; $i++) {
    $diamond[$i] = $diamond[$line * 2 - $i] = array(($line - $i + 1) => true, ($line + $i - 1) => true);
    }
    return $diamond;
    }print_diamond(6);
    其实这个小程序也是遵循了MVC...
    我把任务拆成了2步,1生成菱形数据的以坐标1,1开头的二维数组,2打印
    make_diamond_array()是数据,print_diamond()是视图,最后一行运行函数...就是没什么存在感的控制器吧 - -
    make_diamond_array生成的二维数组中true的位置表示要打印星星,既然菱形上下对称左右也对称,公式应该不难找
      

  2.   

    写完发现,print_diamond其实适合打印所有类似的二维图形...命名不恰当
      

  3.   

    for($i=1;$i<=2*$n-1;$i++){//外层for控制金字塔的层数
    应为
    for($i=1;$i<=$n;$i++){//外层for控制金字塔的层数
      

  4.   

    <?php
    //打印空心菱形
    $n=8;
    for($i=1;$i<=2*$n-1;$i++){//外层for控制金字塔的层数
    //在打印*前先打印空格
    if($i<=$n){
    for($k=1;$k<=$n+1-$i;$k++){
    echo "&nbsp";
    }
    //能内层for控制每层*的个数
    for($j=1;$j<=2*$i-1;$j++){
    if($i==1){
    echo '*';
    }else{
    if($j==1||$j==2*$i-1){
    echo '*';
    }else{
    echo '&nbsp';
    }
    }
    }
    }else{        //问题出现在这个else里
    for($k=1;$k<=$i-$n+1;$k++){        //这里$k <= $i-$n 应该为$k<=$i-$n+1
    echo '&nbsp';
    }
    for($j=1;$j<=2*(2*$n-$i)-1;$j++){   
    if($i==2*$n-1){     //你的这里少了一个等于号,所以$i变成了常数 $i = 17
    echo '*';
    }else{
    if($j==1||$j==2*(2*$n-$i)-1){
    echo '*';
    }else{
    echo '&nbsp';
    }
    }
    }
    }
    echo '<br/>';
    }
    ?>
            *
           * *
          *   *
         *     *
        *       *
       *         *
      *           *
     *             *
      *           *
       *         *
        *       *
         *     *
          *   *
           * *
            *
      

  5.   

    简化一下为:
    <?php
    //打印空心菱形
    $n=8;   // 共有 2*$n + 1 层
    for($i=1;$i<=2*$n+1;$i++){   //循环所有层
        for($j=1;$j<=2*$n+1;$j++){     //循环所有列,把菱形想成正方形
            if($i<= 9){ //上面$n+1层
                if($j == $n-$i+2 || $j == $n+$i){   //上面n+1层 前面那个*坐标为 $n-$i+2  后面那个为$n+$i
                    echo "*";
                }else{
                    echo "&nbsp;";
                }
            }else{ //下面$n层
                if($j == $i-$n || $j == 3*$n-$i+2){   //下面层,前面那个*坐标为 $i-$n 后面为 3*$n-$i+2
                     echo "*";
                }else{
                     echo "&nbsp;";
                }
            }
        }
        echo '<br/>';
    }
    ?>
      

  6.   

    <?php
        //打印空心菱形
        $n=8;   // 共有 2*$n + 1 层
        for($i=1;$i<=2*$n+1;$i++){   //循环所有层
            for($j=1;$j<=2*$n+1;$j++){     //循环所有列,把菱形想成正方形
                if($j == $n-$i+2 || $j == $n+$i || $j == $i-$n || $j == 3*$n-$i+2){  
                    echo "*";
                }else{
                    echo "&nbsp;";
                }
          }
           echo '<br/>';
    }
    如果看的懂的话,还可以直接这样写
    ?>
      

  7.   

    一層循環即可。function diamond($n=3){ if($n==1){ echo '*'; return; } for($i=0,$rows=($n*2)-1; $i<$rows; $i++){
    if($i<=$rows/2){
    $tmp = ($i*2)+1;
    echo str_pad('',($rows-$tmp)/2,' ',STR_PAD_LEFT).str_pad(str_pad('',$tmp-2,' ',STR_PAD_BOTH),$tmp,'*',STR_PAD_BOTH)."\r\n";
    }else{
    $tmp = ($rows/2-($i-$rows/2+1))*2+1;
    echo str_pad('',((($i*2)+1)-$rows)/2,' ',STR_PAD_LEFT).str_pad(str_pad('',$tmp-2,' ',STR_PAD_BOTH),$tmp,'*',STR_PAD_BOTH)."\r\n";
    }
    }}echo '<xmp>';
    diamond(5);
    echo '</xmp>';
        *
       * *
      *   *
     *     *
    *       *
     *     *
      *   *
       * *
        *
      

  8.   

    $start = 1;
    $end = 50;
    $middle = $end / 2; 
    $space = "&nbsp";
    $str = '';for ($layer = $start; $layer <= $end; $layer++) {
      
        if ($layer == $start || $layer == $end) {
            $str .= str_repeat($space,  $middle);
            $str .= '*';
        } else {
            $str .= str_repeat($space, abs($middle - $layer));
            $str .= '*';
            $str .= str_repeat($space, $layer <= $middle ? $layer*2 - 1 :  ($end - $layer) * 2 - 1) ;
            $str .= '*';
        }
        $str .= '<br />';
    }echo $str;