作为程序员一定要保持良好的睡眠,才能好编程

php实现一个菱形显示

发布时间:2018-12-03



请打印菱形

<?php

$max=5;


for($i=1;$i<=$max;$i++){

	 
	printf(str_repeat(' ',$max-$i).str_repeat('*',$i).PHP_EOL);

	if($i==5){

		for($j=$i-1;$j>=1;$j--){
			printf(str_repeat(' ',$max-$j).str_repeat('*',$j).PHP_EOL);
		}

	}
	 


}


echo PHP_EOL;

  $n=3;   // 共有 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 "-";
		}

	}

	echo PHP_EOL;
}

echo PHP_EOL;

for($i=1;$i<=5;$i++){

        //打印空格
        for($j=1;$j<=5-$i;$j++){
            echo " ";
        }

        //打印*号
        for($k=1;$k<=2*$i-1;$k++){
            echo "*";
        }

        echo PHP_EOL;
    }
 

 echo PHP_EOL;




function jinzita($n){

 	for($i=1;$i<=$n;$i++){
 		//打印前边空格
 		echo str_repeat(' ',$n-$i); //前边空格等于 $n-$i

 		echo str_repeat('*',2*$i-1); //星星号等于 2*$n-1

 		echo PHP_EOL; 
 	}

 }


 jinzita(5);

 echo PHP_EOL;




 function lingxing($n){

 	for($i=1;$i<=$n;$i++){
 		//打印前边空格
 		echo str_repeat(' ',$n-$i); //前边空格等于 $n-$i

 		echo str_repeat('*',2*$i-1); //星星号等于 2*$n-1

 		echo PHP_EOL;

 		if($i==$n){
 			for($j=$n-1;$j>=1;$j--){

 				echo str_repeat(' ',$n-$j); //前边空格等于 $n-$i

		 		echo str_repeat('*',2*$j-1); //星星号等于 2*$n-1

		 		echo PHP_EOL;


 			}
 		}


 	}

 }

 lingxing(5);


 echo PHP_EOL;
 echo '================================';
 echo PHP_EOL;
 //$n=5;
    for($i=1;$i<=5;$i++){
        //打印空格
        for($j=1;$j<=5-$i;$j++){
            echo " ";
        }
    //打印*号
    for($k=1;$k<=2*$i-1;$k++){
        //打印第一行后最后一行都打*连接
        if($i==1 || $i==5){
            echo "*";
        }else{
        //怎么打空格和*号的问题
            if($k==1 || $k==2*$i-1){
                echo "*";
            }else{
                echo " ";
            }
        }
    }
    echo PHP_EOL;
    }




下面我把打印菱形封装成一个方法:

function lingxing($num,$space=' '){

    for($i=1;$i<=$num;$i++){     
        printf(str_repeat($space,$num-$i).str_repeat('*',2*$i-1).PHP_EOL);
        if($i==5){
            for($j=$num-1;$j>=1;$j--){
                printf(str_repeat($space,$num-$j).str_repeat('*',2*$j-1).PHP_EOL);
            }
        }
    }
}

这是打印菱形的方法调用

原理解析:

for从1开始循环 到$num 退出  

首先记录打印空格  $num-$i 这是空格

然后计算打印 *  每一行都打印几个 *?   这是公式: 2*$i-1 


当 $i 到了最大的时候,倒着打印   $j=$num-1; $j>=1;$j--

依然计算空格打印数量、*号打印数量

printf(str_repeat(' ',$num-$j));


printf(str_repeat('*',2*$j-1));

这样一个菱形就出来了。



深入剖析:


空心菱形如何打印

function kongxin($num,$printStr='*',$space=' '){
    $data=[];
    for($i=1;$i<=$num;$i++){
        $data[]=sprintf(str_repeat($space,$num-$i).str_repeat($printStr,2*$i-1));
        if($i==5){
            for($j=$num-1;$j>=1;$j--){
                $data[]=sprintf(str_repeat($space,$num-$j).str_repeat($printStr,2*$j-1));
            }
        }
    }

    $len=count($data);
    for($i=0;$i<$len;$i++){
        $str=$data[$i];
        if($i==0 || $i==$len-1){
            echo $str.PHP_EOL;    
            continue;
        }
        $spaceNum= strpos($str,$printStr);
        echo str_repeat($space,$spaceNum).$printStr.str_repeat($space,strlen(trim($str))-2).$printStr.PHP_EOL;
    }
}

kongxin(5);
    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *


代码解析:


先计算出一个菱形,然后通过遍历,把中间的*号去掉