0504 php基础整理 运算符 控制语句 数组 函数
运算符
算术运算符
有以下几个:+ (加) -(减) * (乘) / (除) %(取余)
注意:注意取余运算%,先取整,再取余
自增自减运算符: ++ (加加) -- (减减)
常规:对数字进行自加1或自减1。
字符串: 只能自增,且自增的效果就是“下一个字符”
布尔值递增递减无效
ull递减无效,递增结果为1
前加加和后加加的区别:
前++:先完成变量的递增运算,再取得该变量的值参与别的运算。
后++:先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算。
推论1:如果独立语句中进行自加运算,前自加后自加没有区别 。
推论2:如果前自加后自加是放在别的语句中,则会有所区别。
推论3: 前加加比后加加效率略高(在循环中建议使用前加加)。
比较运算符:
包括:> >= < <= ==松散相等 != ===严格相等 !==
==和===的区别:
==:松散相等,比较的是两个数据“类型转换之后”是否有可能相等,也常常认为是“数据内容是否相同”
===:严格相等,全等,只有两个数据的类型和数据的内容都完全一致,才相等。
常见不同类型的比较(主要指标量类型的数据)——非正常比较
正常比较——数字的大小比较
如果有布尔值,均转为布尔值比较:规则:true > false
否则,如果有数字,均转为数字比较:
否则,如果两边都是纯数字字符串,转为数字比较
否则,就按字符串比较
字符串的比较规则为:按字符的先后顺序依次一个一个比较,发现哪个大,则就表示整体大,后续不再比较
逻辑运算符:&& || !
前提:都是针对布尔类型的值进行的运算,如果不是布尔,就会转换为布尔。
逻辑与:&&
只有两个都是true,结果才是true只要有一个是false,结果就是false
逻辑或:||
只有两个都是false,结果才是false
只要有一个是true,结果就是true
逻辑非:
!true ==> false
!false ===>true
字符串运算符:
只有一个: .
衍生一个: .=
会将运算符两边的数据转换为字符串。
对比js:+(具有双重含义,此时就需要一定的“判断”)
赋值运算符:
只有一个:=
衍生多个:+= -= *= /= %= .=
条件(三目)运算符:
一般的运算符需要2个数据参与
有几个运算符只需要一个数据参与: ++, -- !
则:
条件运算符就需要至少3个数据参与!
形式为:数据1 ? 数据2 :数据3
通常,数据1最终应该是一个布尔值(如果不是,则会当作布尔值来使用)。
判断语句
if语句:
if(条件判断){
//语句块
}
if else 语句:
if(条件判断){
//分支1
}
else{
//分支2;
}
switch语句:
switch(一个数据$v1){ //判断此v1变量跟下面的某个是否相等,如果相等,则进入对应进程。
case 状态值1:
//进程1
[break;]
case 状态值2:
//进程2
[break;]
case 状态值3:
//进程3;
[break;]
。。。。。。
[default ://默认进程。]
}
应用冲,break通常都会用上;只有一些特殊数据或需求的时候,可能不用。
如果没有使用break,则一旦某个状态满足,就会继续执行后续状态中的进程代码,而不再判断。
while循环:
$v1 = 10; //初始化循环变量
while( $v1〉4 ){ //判断循环变量的条件
//语句快
echo “abc”;
$v1--;
}
循环3要素:
1,循环变量初始化
2,循环变量判断
3,循环变量改变
此3 要素通常适用于所有循环过程。
do while循环
do{
//循环体
}while(条件判断);
含义:
先执行一次循环体,然后判断条件,如果条件满足,则继续回去执行循环体,然后再判断,依次类推。
for循环:
循环的中断
这里指的中断,适用于所有循环。
循环的中断有两种情况:
break中断: 终止整个循环语句,而跳出循环进入到循环结构之后的语句
continue中断:跳过本次循环,执行下一次循环
控制脚本执行进度
die(“输出内容”)
含义:终止php脚本的运行(后续代码不再执行),并输出其中的内容
也可以:die(); die;
exit是die的同义词。
die是一种“语言结构”,并非函数,可以不写括号。
echo也是一种语言结构,而非函数:
echo (“abc”);
echo “abc”;
echo “abc”, “def”, 123;
sleep($n);
含义:让php脚本停止$n秒,然后继续执行。
数组基础
php中,数组的下标可以是整数,或字符串。
php中,数组的元素顺序不是由下标决定,而是由其“加入”的顺序决定。
定义:
$arr1 = array(元素1,元素2,。。。。。 );
array(1, 5, 1.1, “abc”, true, false); //可以存储任何数据,此时为“默认下标”,
array(2=>1, 5=>5, 3=>1.1, 7=>“abc”, 0=>true);//下标可以任意设定(无需顺序,无需连续)
//默认下标规则:前面已经用过的最大数字下标+1
array(2=>1, 5, 1=>1.1, “abc”, 0=>true)//可以加下标,也可以不加(默认下标),
下标分别是:2,3,1,4,0
array(2.7=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true);
//浮点数下标为自动转换为整数,且直接抹掉小数
//纯数字字符串下标,当作数字看待,
//则此时下标为:2, ‘dd’, 11, 12, 13
array(2=>1, ‘dd’=>5, true=>1.1, “abc”, false=>true)//布尔值当下标,则true为1,false为0;
array(2=>1, ‘dd’=>5, 2=>1.1, “abc”, true)//如果下标跟前面的重复,则单纯覆盖前面同名下标的值
//此时相当于为:array(2=>1.1, ‘dd’=>5, “abc”, true)
数组的分类
从键值关系:
关联数组:通常是指下标为字符串,并且该字符串大体可以表达出数据的含义的数组。
例:$person = array(
“name” => “小花”,
“age”=>18,
“edu” => “大学毕业” ,
);
索引数组:
通常是指一个数组的下标是严格的从0开始的连续的数字下标——跟js数组一样。
从数组层次来分:
一维数组:
就是一个数组中的每一个元素值,都是一个普通值(非数组值)
$arr1 = array(
“name” => “小花”,
“age”=>18,
“edu” => “大学毕业”
);
二维数组:
一个数组中的每一项,又是一个一维数组。
$arr1 = array(
“name” => array(‘小花’, ‘小芳’, ‘小明’, );
“age”=> array(18, 22, 19),
“edu” => array(“大学毕业”, ‘中学’, ‘小学’)
);
多维数组:
依此类推。。。
数组遍历
遍历基本语法
foreach( $arr as [ $key => ] $value ) //$key可以称为键变量,$value可以称为值变量。
{
//这里就可以对$key 和 $value 进行所有可能的操作——因为他们就是一个变量
//$key 代表每次取得元素的下标,可能是数字,也可以能是字符串
//$value 代表每次取得元素的值,可能是各种类型。
//此循环结构会从数组的第一项一直遍历循环到最后一项,然后结束。
}
foreach 遍历细节探讨
foreach也是正常的循环语法结构,可以有break和continue等操作。
遍历过程中值变量默认的传值方式是值传递。
遍历过程中值变量可以人为设定为引用传递:
foreach($arr as $key => &$value){ ... }
键变量不可以设定为引用传递
foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作(就是指前面的指针函数),则会复制数组后在复制的数组上继续遍历循环。
foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
数组排序思想介绍
冒泡排序
一般性逻辑描述:
1,对该数组从第一个元素开始,从左到右,相邻的2个元素比较大小:如果左边的比右边的大,则将他们俩交换位置,结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php $arr2 = array(5,15,3,4,9,11); $len = count($arr2); //1,需要进行n-1趟的“冒泡”比较过程。 echo "<br/> 排序之前:"; print_r($arr2); for($i = 0; $i<$len-1;++$i){ //设定比较的躺数 //2, 每一趟的比较都前一趟少比一次,每一趟需要比较n-1次 for($k=0;$k<$len-1-$i;++$k){ //设定本趟比较的次数 //这里实现下标为$k和下标为$k+1这两项的比较: if($arr2[$k]>$arr2[$k+1]){ $temp = $arr2[$k]; $arr2[$k]=$arr2[$k+1]; $arr2[$k+1] = $temp; } } } echo "<br/>排序之后:"; print_r($arr2); ?>
选择排序
一般性逻辑描述:
第1趟:取得该数组中的最大值及其下标,然后跟该数组的最后一项“交换”(倒数第1项确定)
第2趟:取得该数组中除最后1项中的最大值及其下标,然后跟倒数第2项交换(倒数第2项确定)
第3趟:取得该数组中除最后2项中的最大值及其下标,然后跟倒数第3项交换(倒数第3项确定)
数组查找:
就是从一个数组中找一个元素的数据(可能是找下标,也可以是找数据值)
数组的查找通常有2种需求:
1:判断要找的数据是否存在。
2:找出要找的数据的位置(下标)
顺序查找
从一个数组中按顺序找出一个元素(下标或值)
二分查找
二分查找的前提:
1,针对一个已经进行了排序的数组(即里面的数据已经是有序了)
2,是连续的索引数组,比如下标为:0, 1, 2, 3, ......
函数
基本使用
函数定义形式
function 函数名 (形参1,形参2,.... ){
//函数体(代码块)
}
函数调用形式
本质上就是使用一个名字来达到执行其中函数中的代码的作用。通常可以分两种情形的调用:
第一种:没有返回值的函数,则调用语句是独立语句:
函数名(实参1,实参2, .... ); //实参个数应该跟形参有匹配性。
第二种:有返回值的函数,则调用语句,通常会“混杂”在别的语句中,并将要将该调用语句当作一个“数据”来使用:
A: $v1 = 函数名(); //赋值给其他变量;这里省略实参语法,下同。
B: $v1 = 函数名() * 3 + 6; //参与运算,然后再赋值;
C: echo 函数名(); //直接输出
D: echo 函数名() * 3 + 6; //参与运算,然后再输出
E: $v1 = 函数名2( 函数名() , 实参2,实参3, .... ); //当作实参使用
实际上,一个变量(数据)也只有这几种场合的使用情况。
函数调用形式
本质上就是使用一个名字来达到执行其中函数中的代码的作用。通常可以分两种情形的调用:
第一种:没有返回值的函数,则调用语句是独立语句:
函数名(实参1,实参2, .... ); //实参个数应该跟形参有匹配性。
第二种:有返回值的函数,则调用语句,通常会“混杂”在别的语句中,并将要将该调用语句当作一个“数据”来使用:
A: $v1 = 函数名(); //赋值给其他变量;这里省略实参语法,下同。
B: $v1 = 函数名() * 3 + 6; //参与运算,然后再赋值;
C: echo 函数名(); //直接输出
D: echo 函数名() * 3 + 6; //参与运算,然后再输出
E: $v1 = 函数名2( 函数名() , 实参2,实参3, .... ); //当作实参使用
实际上,一个变量(数据)也只有这几种场合的使用情况。
函数参数问题
一个函数,
在定义时,有形式参数(形参);
1,形参一定是一个变量名!
2,该变量名只能是在该函数中有效的变量名;
3,而且只在该函数调用并执行时有效,函数结束,通常这些变量也就“销毁”。
在调用时,有实际参数(实参)。
实参就是一个“实际数据”,
该数据可以是一个“直接数据”(比如5,”abc”),也可以是一个变量中存储的数据。
实参的作用是将其数据“赋值给”形参变量。
实参跟形参之间通常应该有个“一一对应”关系:
定义形式: function 函数名(形参1,形参2,...... ){ 。。。。}
调用形式: 函数名(实参1,实参2,..... )