zoukankan      html  css  js  c++  java
  • 0xx_PHP03

    1.1 今日目标

    1. 理解循环结构的应用场景;
    2. 掌握while循环实现迭代原理;
    3. 掌握for循环实现迭代原理;
    4. 掌握foreach循环实现迭代原理;
    5. 理解二维数组的遍历原理;
    6. 理解循环控制的概念;
    7. 掌握循环控制中continue和break的效果和区别;
    8. 理解函数的作用;
    9. 掌握自定义函数的定义;
    10. 理解形参的工作原理以及作用;
    11. 了解参数默认值的工作原理;
    12. 了解强类型形参的作用;
    13. 理解返回值return在函数中的实际含义;
    14. 了解强类型返回值的作用;
    15. 掌握函数的调用;
    16. 掌握可变函数的使用方式;
    17. 了解匿名函数的使用方式;
    18. 知道如何在API中查找所需使用的系统函数;

    1.2 循环

    1.2.1 for

    for(初始值;条件;增量){
    	//循环体
    }
    

    注意:循环中千万不能出现死循环

    思考:如下代码输出什么

    例题一:

    <?php
    for($i=1;$i<=10;$i+=2){
    	echo "{$i}:锄禾日当午<br>";
    }
    /*
    1:锄禾日当午
    3:锄禾日当午
    5:锄禾日当午
    7:锄禾日当午
    9:锄禾日当午
    */
    

    例题二:

    <?php
    for($i=1;$i<=10;){
    	
    }
    //死循环,$i永远等于1,1永远小于10,条件永远为true
    

    例题三

    <?php
    for($i=1;;$i++){
    }
    //死循环,只要没有条件都是死循环
    

    例题四

    <?php
    for(;;){
    }
    //这是一个经典的死循环
    

    1.2.3 思考题

    1、如下代码循环了几次?

    for($i=1;$i!=5;$i++){
        
    }
    //循环了4次
    

    2、在循环N次循环体中,初始值执行了几次?条件执行了几次?增量执行了几次?

    初始值执行了1次
    条件执行了N+1次
    增量执行了N次
    

    3、在循环执行完毕后,$i的值是存在的。

    <?php
    for($i=1;$i<=3;$i++){
    }
    echo $i;		//4
    

    1.2.4 while、do-while

    语法

    while(条件){
    }
    -------------------------
    do{
        
    }while(条件)
    

    小结:

    1、for、while、do-while可以相互替换

    2、如果明确知道循环多少次首先for循环,如要要循环到条件不成立为止选while或do-while

    3、先判断再执行选while,先执行再判断选do-while

    4、while循环条件不成立就不执行,do-while至少执行一次

    1.2.5 例题

    1、使用三种循环实现从1加到100

    <?php
    //1、for循环实现
    $sum=0;
    for($i=1;$i<=100;$i++){
    	$sum+=$i;	//$sum=$sum+$i;
    }
    echo $sum;
    
    //分析
    /**
    *
    $i			$sum
    1			1
    2			1+2
    3			1+2+3	
    4			1+2+3+4
    ...
    100			1+2+3+++100
    */
    -------------------------------------------------
    //2、while循环
    $i=1;
    $sum=0;		//保存和
    while($i<=100){
    	//方法一
    	/*
    	$sum+=$i;
    	$i++;
    	*/
    
    	//方法二
    	$sum+=$i++;
    }
    echo $sum;
    --------------------------------------------------
        
    //3、do-while循环
    $i=1;
    $sum=0;
    do{
    	$sum+=$i;
    	$i++;
    }while($i<=100);
    echo $sum,'<br>';	//5050
    
    //可以有如下更改
    $i=1;
    $sum=0;
    do{
    	$sum+=$i++;      //++后置
    }while($i<=100);
    echo $sum,'<br>';	//5050
    
    //可以做如下更改
    $i=1;
    $sum=0;
    do{
    	$sum+=$i;
    }while(++$i<=100);    //++前置
    echo $sum,'<br>';		//5050
    

    小结:

    1、for、while、do-while可以相互替换

    2、结合++前置和++后置考虑逻辑

    1.2.6 多语句表达式

    初始值、增量可以由多条语句组成

    例题:数字分解

    <?php
    for($i=1,$j=9;$i<=$j;$i++,$j--){
    	echo "10可以分成{$i}和{$j}<br>";
    }
    //运行结果
    /*
    10可以分成1和9
    10可以分成2和8
    10可以分成3和7
    10可以分成4和6
    10可以分成5和5
    */
    

    小结:初始值、增量可以写多个表达式,但是条件一般只写一个,如果条件写多个,只是最后一个条件起作用

    1.2.7 双重循环

    1、打印阶梯数字

    <?php
    for($i=1;$i<=9;$i++){	//循环行
    	for($j=1;$j<=$i;$j++){	//循环列
    		echo $j,'&nbsp;';
    	}
    	echo '<br>';
    }
    //运行结果
    1 
    1 2 
    1 2 3 
    1 2 3 4 
    1 2 3 4 5 
    1 2 3 4 5 6 
    1 2 3 4 5 6 7 
    1 2 3 4 5 6 7 8 
    1 2 3 4 5 6 7 8 9 
    

    2、打印九九乘法表

    <style type="text/css">
    	table{
    		980px;
    	}
    	table,td{
    		border:solid 1px #0000FF;
    		border-collapse:collapse;
    	}
    	td{
    		height:40px;	
    	}
    </style>
    
    <table>
    <?php
    for($i=1;$i<=9;$i++){	//行
    	echo '<tr>';
    	for($j=1;$j<=$i;$j++){	//列
    		echo "<td>{$j}*{$i}=".($j*$i).'</td>';
    	}
    	echo '</tr>';
    }
    ?>
    </table>
    

    运行结果

    小结:规则:当前列*当前行

    1.28 foreach

    foreach循环是用来遍历数组

    语法

    //语法一
    foreach(数组 as 值){
    }
    //语法二
    foreach(数组 as 键=>值){
    }
    

    例题

    <?php
    $stu=['tom','berry','ketty'];
    foreach($stu as $v){
    	echo $v,'<br>';
    }
    /**
    tom
    berry
    ketty
    */
    echo '<hr>';
    -----------------------------------------------------------
    foreach($stu as $k=>$v){
    	echo "{$k}:{$v}<br>";
    }
    /**
    0:tom
    1:berry
    2:ketty
    */
    

    1.3 跳转语句

    1.3.1 语法

    break:中断循环

    continue:中断当前循环,进入下一个循环

    例题:

    <?php
    for($i=1; $i<=10; $i++) {
    	if($i==5)
    		break;  //中断循环
    	echo "{$i}:锄禾日当午<br>";
    }
    //结果
    1:锄禾日当午
    2:锄禾日当午
    3:锄禾日当午
    4:锄禾日当午
    --------------------------------------------------
    <?php
    for($i=1; $i<=10; $i++) {
    	if($i==5)
    		continue;  //跳出5,进入6循环
    	echo "{$i}:锄禾日当午<br>";
    }
    1:锄禾日当午
    2:锄禾日当午
    3:锄禾日当午
    4:锄禾日当午    //注意,没有打印第5句
    6:锄禾日当午
    7:锄禾日当午
    8:锄禾日当午
    9:锄禾日当午
    10:锄禾日当午    
    

    1.3.2 中断多重循环

    break和continue默认中断、跳出1重循环,如果调中断、跳出多重循环,在后面加一个数字。

    <?php
    for($i=1; $i<=10; $i++) {
    	for($j=1;$j<=$i;$j++){
    		echo $j.'&nbsp;';
    		if($j==5){
    			break 2;   //中断2重循环
    		}
    	}	
    	echo '<br>';
    }
    //运行结果
    1 
    1 2 
    1 2 3 
    1 2 3 4 
    1 2 3 4 5 
    

    练习

    <?php
    for($i=1; $i<=10; $i++) {
    	switch($i){
    		case 5:
    			break 2;
    	}
    	echo $i,'<br>';
    }
    //结果
    1
    2
    3
    4
    

    小结:switch的本质是循环了一次的循环

    1.4 替代语法

    php中除了do-while以外,其他的语法结构都有替代语法

    规则:左大括号变冒号,右大括号变endXXX

    //if的替代语法
        if():
    
        elseif():
    
        else:
    
        endif;
    //switch替代语法
        switch():
    
        endswitch;
    //for
        for():
    
        endfor;
    //while
        while():
    
        endwhile;
    //foreach
        foreach():
    
        endforeach;
    

    例题:在混编的时候用替代语法

    <body>
    <?php
    for($i=1;$i<=10;$i++):
    	if($i%2==0):
    ?>
    	<?php echo $i;?>:锄禾日当午<br>
    <?php
    	endif;
    endfor;
    ?>
    </body>
    //运行结果
    2:锄禾日当午
    4:锄禾日当午
    6:锄禾日当午
    8:锄禾日当午
    10:锄禾日当午
    

    小结:可以通过替代语法证明else if之间如果有空格是嵌套if语句。

    <?php
    $score=80;
    if($score>=90):
    	echo 'A';
    elseif($score>=80):    //elseif之间没有空格,如果有空格是嵌套if语句
    	echo 'B';
    else:
    	echo 'C';
    endif;
    ----------------------------------------
    <?php
    $score=80;
    if($score>=90):
    	echo 'A';
    else:
    	if($score>=80):
    		echo 'B';
    	
    	else:
    		echo 'C';
    	endif;
    endif;
    

    1.5 函数

    1、函数就是一段代码块

    2、函数可以实现模块化编程

    1.5.1 函数定义

    function 函数名(参数1,参数2,...){
        //函数体
    }
    

    通过函数名()调用函数

    <?php
    //定义函数
    function show() {
    	echo '锄禾日当午<br>';
    }
    //调用
    show();		//锄禾日当午
    SHOW();		//锄禾日当午  函数名不区分大小写
    

    小结:

    1、变量名区分大小写

    2、关键字、函数名不区分大小写

    1.5.2 可变函数

    将函数名存储到变量中

    <?php
    function show($args) {
    	echo $args,'<br>';
    }
    $str='show';	//将函数名保存到变量中
    $str('锄禾日当午');
    

    例题:随机调用函数

    <?php
     //中文显示
    function showChinese() {
    	echo '锄禾日当午<br>';
    }
    //英文显示
    function showEnglish() {
    	echo 'chu he re dang wu<br>';
    }
    //测试
    $fun=rand(1,10)%2?'showChinese':'showEnglish';   //可变变量
    $fun();
    

    1.5.3 匿名函数

    匿名函数就是没有名字的函数

    <?php
    //匿名函数
    $fun=function(){
    	echo '锄禾日当午<br>';
    };
    //匿名函数调用
    $fun();
    

    1.5.4 参数传递

    函数的参数有形式参数和实际参数

    形式参数是定义函数时候的参数,只起形式的作用,没有具体的值

    实际参数的调用函数时候的参数,有具体的值

    <?php
    function fun($num1,$num2) {
    	echo $num1+$num2;
    }
    fun(10,20);		//30
    

    默认情况下,参数的传递是值传递

    <?php
    $num=10;
    function fun($args) {
    	$args=100;
    }
    fun($num);
    echo $num;		//10
    

    地址传递

    <?php
    $num=10;
    //地址传递
    function fun(&$args) {   //&符表示取地址
    	$args=100;
    }
    fun($num);
    echo $num;		//100
    

    小结

    1、函数的参数默认是值传递

    2、如果要传递地址,在参数前面加&

    3、如果是地址传递,不能直接写值

    function fun(&$args) {
    	$args=100;
    }
    fun(10);   //Fatal error: Only variables can be passed by reference (只有变量才能传递引用)
    

    1.5.5 参数默认值

    1、在定义函数的时候给形参赋值就是参数的默认值

    <?php
    //参数的默认值
    function fun($name,$add='地址不详') {
    	echo '姓名:'.$name,'<br>';
    	echo '地址:'.$add,'<hr>';
    }
    //测试
    fun('tom','北京');
    fun('berry');
    

    2、默认值必须是值,不能用变量代替

    <?php
    $str='地址不详'
    function fun($name,$add=$str) {   //错误,默认值可以使用变量
    	echo '姓名:'.$name,'<br>';
    	echo '地址:'.$add,'<hr>';
    }
    

    3、默认值可以使用常量

    <?php
    define('ADD','地址不详');
    function fun($name,$add=ADD) {    //默认值可以使用常量
    	echo '姓名:'.$name,'<br>';
    	echo '地址:'.$add,'<hr>';
    }
    //测试
    fun('berry');
    

    4、有默认值的写在后面,没有默认值的写在前面

    <?php
    //没有默认值的写在前面,有默认值写在后面
    function fun($name,$age='未知',$add='地址不详') {
    	echo "姓名:{$name}<br>";
    	echo "年龄:{$age}<br>";
    	echo "地址:{$add}<br>";
    }
    fun('tom');
    //运行结果
    姓名:tom
    年龄:未知
    地址:地址不详
    

    1.5.6 参数个数不匹配

    <?php
    function fun($num1,$num2) {
    	echo $num1,'<br>';
    	echo $num2,'<br>';
    }
     //fun(10);	//实参少于形参(报错)
    fun(10,20,30); //实参多于形参,只取前面对应的值
    

    获取所有传递的参数

    <?php
    function fun() {
    	//echo func_num_args(),'<br>';	//获取参数的个数
    	$args=func_get_args();	//获取参数数组
    	print_r($args);
    }
    fun(10);
    fun(10,20);
    fun(10,20,30); 
    

    1.5.7 参数约束

    1、定义变长参数(了解)

    <?php
    // ...$hobby包含了除了前面两个参数以外的所有参数
    function fun($name,$age,...$hobby) {
    	echo '姓名:'.$name,'<br>';
    	echo '年龄:'.$age,'<br>';
    	print_r($hobby);
    	echo '<hr>';
    }
    fun('tom',22);
    fun('berry',25,'读书','睡觉');
    

    运行结果

    多学一招:

    function fun(...$args) {
    	print_r($args);
    	echo '<br>';
    }
    $num=[10,20];
    echo '<pre>';
    fun(...$num);   //将数组中的参数展开
    //运行结果
    /*
    Array
    (
        [0] => 10
        [1] => 20
    )
    */
    

    2、参数类型约束

    //类型约束
    function fun(string $name,int $age) {
    	echo "姓名:{$name},'<br>'";
    	echo "年龄:{$age}<br>";
    }
    fun('tom',22);
    //约束$name是字符串型,$age是整型
    

    3、返回值约束

    function fun(int $num1,int $num2):int {  //必须返回整型
    	return $num1+$num2;
    }
    echo fun(10,20);		//30
    

    可以约束:string、int、float、bool、数组

    //约束返回类型是数组
    function fun():array {
    }
    //约束return后面不能有返回值  必须在7.1以后的版本中才支持
    function fun():void {    //void是空的意思
    	return;
    }
    fun();
    

    1.6 return

    1.6.1 终止脚本执行

    <?php
    echo '锄禾日当午<br>';
    return;			//终止脚本执行
    echo '汗滴禾下土<br>';	//不执行
    

    提醒:return只能中断当前页面,如果有包含文件,只能中断包含文件

    例题:

    6-demo.php

    <?php
    echo '锄禾日当午<br>';
    require './test.php';    //包含文件
    echo '汗滴禾下土<br>';
    

    test.php

    <?php
    echo 'aaa<br>';
    return;   //只能中断test.php
    echo 'bbb<br>';
    

    运行结果

    如果要完全终止脚本执行,使用exit()、或die()

    echo 'aaa<br>';
    exit();  //die()
    echo 'bbb<br>';
    

    1.6.2、返回页面结果

    test.php

    <?php
    return array('name'=>'tom','sex'=>'男');
    

    6-demo.php

    <?php
    $stu=require './test.php';
    print_r($stu);  //Array ( [name] => tom [sex] => 男 ) 
    

    小结:在项目中引入配置文件就使用这种方法

    1.6.3 函数的返回和终止

    return在函数中使用作用有二
    1、终止函数执行

    2、返回值

    function fun() {
    	echo 'aaa';
    	return ;		//终止函数执行
    	echo 'bbb';
    }
    fun();   //aaa
    ----------------------------------
    function fun() {
    	return 10;	//返回值
    }
    echo fun();		//10
    

    1.7 作业讲解

    计算器

    <body>
    <?php
    $num1='';	//$num1的初始值
    $num2='';	//$num2的初始值
    $op='';		//操作符
    $result='';	//结果
    if(!empty($_POST)) {
    	$num1=$_POST['num1'];
    	$num2=$_POST['num2'];
    	$op=$_POST['op'];		//操作符
    	switch($op){
    		case '+':
    			$result=$num1+$num2;
    			break;
    		case '-':
    			$result=$num1-$num2;
    			break;
    		case '*':
    			$result=$num1*$num2;
    			break;
    		case '/':
    			$result=$num1/$num2;
    			break;
    	}
    }
    ?>
    <form method="post" action="">
    	<input type="text" name="num1" value='<?php echo $num1?>'>
    	<select name="op">
    		<option value="+" <?php echo $op=='+'?'selected':''?>>+</option>
    		<option value="-" <?php echo $op=='-'?'selected':''?>>-</option>
    		<option value="*" <?php echo $op=='*'?'selected':''?>>*</option>
    		<option value="/" <?php echo $op=='/'?'selected':''?>>/</option>
    	</select>
    	<input type="text" name="num2" value='<?php echo $num2?>'>
    	<input type="submit" name="button" value="=">
    	<input type="text" name="result" value='<?php echo $result?>'>
    </form>
    </body>
    

    运行结果

    1.8 作业

    1、 通过for循环将数组中值求和、求平均值

    2、数组翻转

    3、遍历二维数组

    4、 循环输出1-100,其中3的倍数输出A,5的倍数输出B,15输出C。

    5、 打印水仙花数

    6、 打印100以内的斐波那契数(迭代法) 1 1 2 3 5 8 13 21 .....

    7、 打印星星

    8、 生成颜色面板

  • 相关阅读:
    Luogu P4002 [清华集训2017]生成树计数
    Luogu P3978 [TJOI2015]概率论
    Codechef JADUGAR2 Chef and Same Old Recurrence 2
    Codechef TREDEG Trees and Degrees
    一些有趣的数
    有向图上Euler回路计数
    P5105 不强制在线的动态快速排序
    二分图小结
    BZOJ2648: SJY摆棋子
    P3231 [HNOI2013]消毒
  • 原文地址:https://www.cnblogs.com/xeclass/p/12655917.html
Copyright © 2011-2022 走看看