PHP基础 第二天
PHP数组
<?php
//使用array关键字定义数组
$arr1=array(); //可以不指定元素,也可以在括号中增加元素
$arr2=array( ' name ' , ' age ' ); //两个都是值,隐式下标
//使用[ ]定义数组
$arr3=[ ];
$arr4=[ ' name ' , ' age ' ];
//针对变量增加元素方式定义数组
$arr4[] = 'name';
?>
数组的使用:PHP中数组的访问其实就是访问数组中的某个元素值,访问方式必须通过数组下标进行访问,默认的数组元素的下标是不可见的,根据元素的顺序从0开始
<?php
$arr=[ ' name ' , ' age ' ]; //实际上[0 => 'name' , 1=> 'age' ]
//访问name值
echo $arr[ 0 ];
?>
PHP中数组的特点:
- 数组中的元素没有数量限制,即数组不限定长度
- 数组可动态增加元素
- 数组元素的值可任意数据类型
- 数组下标可以是纯数字(索引数组),纯字符串(关联数组)和混合数字和字符串(混合数组)
<?php
//索引数组
$arr1=array(1,2,3,4,5);
//关联数组
$arr2=array(' name ' => ' 张三 ' , ' age ' => 30 , ' gender ' => ' 男 ');
//混合数组
$arr3=array(1 ,2, ' name ' => ' 张三 ' , ' age ' => 30 );
//访问:一样,使用下标访问
echo $arr1[ 1 ] ; //2
echo $arr2[ ' name ' ] ; //张三
?>
<?php
//定义数组
$arr=array( 1=>10,10=>100,100=>100 );
//如果默认增加元素;系统自动从最大下标开始+1
$arr[] = 10000;
//增加一个小于已有索引值(下标)元素
$arr[2]=20; //系统不会自动根据索引来排序
var_dump( $arr ); // array(5){ [1]=>int(10) [10]=>int(100) [100]=>int(100) [101]=>int(10000) [2]=>int[20] }
?>
二维数组:普通数组基本都是一维数组,即数组里面的元素全部都是一维的(普通数据),有时在大数据处理的情况下,通常都会存在数组元素本身也是数组的情况。我们把数组元素都是一维数组的数组称为二维数组。建议数组的层级不超过三维
<?php
$user1 =array( ' name ' => ' 张三 ' , age => 30 ) ;
$user2 =array( ' name ' => ' 李四 ' , age => 23 ) ;
$user3 =array( ' name ' => ' 王五 ' , age => 40 ) ; //一维数组
//二维数组
$users = array( $user1 , $user2 , $user3 ) ;
//二维数组访问:先通过一维下标找到对应的数组元素,然后用二维下标读取元素值
//获取张三的年龄
echo $users[0][ 'age' ] ; //$users[0]的结果是$user1,然后组合$user[ 'age' ] ;从而最终获得张三的年龄
?>
总结:使用频率高,在结合数据库操作之后,通常都是关联数组,且在数据展示的时候二维数组居多(第一维索引,第二维关联)
类型判断
定义:类型判定是系统通过指定函数来确定数据的类型,给定判断结果,结果为布尔值(true / false)
1.通过系统函数判定数据类型:函数的格式很好记,使用is_开头,后面跟对应的数据类型,可以通过操作手册查询
<?php
$num = 100;
$str = ' 100 ' ;
//数值
$res = is_numeric( $str ) ;
var_dump( $res ) ; //bool(true),is_numeric是用来判定数据是否是数值或者纯数值的字符串
var_dump( is_scalar($num) ); //bool(true),is_scalar是用来判定数据是否是标量(基本数据类型);is_scalar:是整型,浮点型,布尔型和字符串型,得出的结果都是true
var_dump( is_null($num) ); //bool(false),is_null是用来判定数据是否为NULL
?>
类型转换:2种方式(自动转换,强制转换)
<?php
$num=5;
$str= ' 1.2a35 ' ;
echo $num + $str; //6.2,当前运算为相关运算,所以系统判定数据要求为数值参加运算
echo @( $num + $str ); //@:错误抑制符
var_dump($str); //自动转换不会改变数据本身的数据类型
//字符串转换成数值规则
- 第一个字符是字母或其他特殊符号,结果为0
- 第一个字符是数字,可依此往后保留,直到不是数字为止
- 如果在数字往后推的情况下,碰到第二个小数点结束(保留一个小数点)
?>
强制转换:
<?php
$str=' 1.2.3.4.3abc ' ;
//强制转换成数值
echo (float)$str; //1.2
?>
PHP运算符
赋值运算符:= += -= *= /= .=
.= :" . " 为字符串连接操作符,表示左边的字符串与右边的字符串连起来后赋值给左边变量
注意:在使用“ /= ”进行运算时,右侧的结果不能为0,否则会报错
算术运算符:+ - * /( 右边不能为0 ) %( 右边不能为0 )
错误抑制符
- 单目运算,将可能出现的比较低级的错误给抑制,不报错误
- @:在可能出现错误的表达式之前使用
$a=10 / 0 ; //程序直接报错,非常专业错误
@$a=10 / 0 ; //系统依然错误,报错给用户
比较运算符:> < >= <= == ===
==( 相等 ):左边的值等于右边的值,返回true,否则返回false
===( 全等 ):左边的值等于右边的值,且两边的数据类型一致,才返回true,否则返回false
注意:进行比较时,除非是全等,否则系统会自动转换类型变成统一类型再进行比较
例:
<?php
$a=10 ;
$b=' 10c ' ;
var_dump( $a == $b ) ; //bool(true)
?>
在PHP中,数值转布尔型,只有一种情况是false:0
<?php
$b1=0 ;
$b2=-1 ;
var_dump( ( boolean )$b1,( boolean )$b2 ) ; //bool(false) bool(true)
?>
飞船运算符:类似组合比较运算中的 > , = 和 < 三种运算符于一身
<=>:飞船运算,左边 > 右边返回1, = 右边返回0, < 右边返回-1
<?php
$b1 = 0 ;
$b2 = -1 ;
//飞船运算符
var_dump( $b1 <=> $b2 ) ; //int(1)
//飞船运算符的结果应用
$res = $b1 <=> $b2;
var_dump($res === 1); //bool(true)
?>
合并运算符
用于数据判断取值操作
??:左边表示要判定的表达式,右边表示不成功的默认结果 //存在就成功,不存在就不成功
<?php
//很多时候,用户提交数据中会有一些选填部分,用户可不填代表使用默认值
$gender=$_GET[ ' genter ' ] ?? ' Male ' ;
//表示:如果用户提交的gender信息,那么$gender就保存用户信息;如果没有提交,那么默认使用Male作为$gender的值
echo $gender; //当前没有提交的概念也就是$_GET[ ' genter ' ]不存在,所以值是Male
?>
<?php
//测试:如果合并运算符左侧本身为真,右边表达式是否会计算?
$b=10;
$c=$b ?? $b=5;
echo $c;
var_dump($d); //报错;未定义变量:合并运算符是一种短路运算(如果已经通过左边表达式拿到结果后,后边表达式就不会执行)
$f=0;
$g=$f ?? 1000;
echo $g; //0;合并运算只考虑左侧表达式是否存在,不在乎其结果是否为布尔的true或者false
?>
逻辑运算符:针对运行结果进行运算 && || !
&& (逻辑与运算,也叫and),左右两边结果为true返回true,否则返回false
|| (逻辑或运算,也叫or),左右两边结果至少有一个为true返回true,否则返回false
! (逻辑非运算),原来结果为true返回false,原来结果为false返回true
逻辑运算符(逻辑与和逻辑或)也称之为短路运算符
连接运算符
. :将左右两边的字符串连成一个
<?php
$a='100';
$b='100';
var_dump($a . $b) ; //100100
?>
三目运算符:三个表达式组成的一个运算表达式
表达式1 ? 表达式2 : 表达式3
如果表达式1成立,整个结果为表达式2;否则为表达式3
<?php
$age=18;
//用户是否已成年
$man = $age >= 18 ? ' 成年 ' : ' 未成年 ' ;
echo $man; //成年
?>
<?php
//使用三目运算代替合并元素:判断$x的值传递b变量,否则给变量赋值100
//合并运算
$a = $x ?? 100;
//三目运算实现
$a = isset($x) ? $x : 100 ; //isset用来判定变量是否存在(跟值无关)
//复杂三目运算
//普通三目运算:表达式1 ? 表达式2 : 表达式;
//复杂三目运算:表达式1 ? (表达式2 ? 表达式3 : 表达式4) : 表达式5;
?>
自操作运算符
++ / - - :自增 / 自减
前置自操作:先自我运算,然后把最终自己的结果给其他运算
后置自操作:先自己的结果给其他运算,然后自我运算
$age=18;
$age++;
echo $age; //19
//后置
echo $age++; //19
echo $age; //20
位运算符
& :按位与计算,两位都为1结果为1,否则为0
| :按位或计算,两位有1位为1结果为1,否则为0
^ :按位异或,两位不同则为1,不同则为0
~ :按位取反:1位运算,本身为1结果为0,本身为0结果为1
<< :按位左移,将全部位向左移动,右边补0 //就是乘2的n次方
>> :按位右移,将全部位向右移动,左边补符号位
计算机中的整数是用8个字节存储,一个字节对应8个基准位(位的值只有0和1),一共64位。而PHP中对应的整数是有符号类型(即有正负),左边第一位代表符号为,0代表正数,1代表负数。即00000000……00000001为正1,10000000……00000001理论为负1
因为上述理论的存在,所以系统会存在+0和-0,这样的结果在系统中是浪费的,计算机为了解决这一问题设计了一套计算机码:即计算机中正负数的存在形式
计算机码分为原码,反码和补码
原码是十进制的数(绝对值)转换成的二进制,如-5的原码是00000101;反码则是在原码的基础上符号位不变,其他位取反(0变1,1变0),那么5的反码就是11111010;补码则在反码基础上+1,所以-5的补码是:111111011,这便是系统最终存储的结果。
正数的原码,反码和补码就是原码不变,而负数以补码的形式存储
负数最终显示给用户的结果就是将补码-1,变成反码,然后取反(符号位不变),变成原码
<?php
$a = 5;
$b =3;
//按位与
echo $a & $b;
//00000000……00000101
//00000000……00000011
//00000000……00000001 //最终结果:1
//按位或
echo $a | $b;
//00000000……00000101
//00000000……00000011
//00000000……00000111 //最终结果:7
//按位异或
echo $a ^ $b;
//00000000……00000101
//00000000……00000011
//00000000……00000110 //最终结果:6
//按位取反
echo ~$a;
//00000000……00000101
//11111111…… 11111010 //注意:这是异或后的结果:符号位为1,表示负数(系统为补码),所以要输出的话要转化成原码
//11111111…… 11111001 //反码:补码-1
//10000000 000 00000110 //原码:符号位不变,其他位取反,最终结果-6
//按位左移和右移
echo $a << 1;
//00000000……00000101
//00000000……00001010 //最终结果:10
echo $a >> 1;
//00000000……00000101
//00000000……00000010 //最终结果:2
//在不使用第三方变量的情况下,交换2个变量的值
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,$b; //35;实现交换
?>
<?php
//交换2个整型变量:不适合第三方变量
$a = 5;
$b = 4;
//使用第三方
$temp = $a;
$a = $b;
$b = $temp;
//不使用第三方
$a = 5;
$b = 4;
$a = $a + $b; //a=9,b=4
$b = $a - $b; //a=9,b=5
$a = $a - $b; //a=4,b=5
//使用按位异或 //一个数两次异或同一个数,回到原来的数
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,$b;
?>
运算符优先级
IF分支结构
IF分支根据业务的复杂性可以分为3种,即简单if分支,标准if分支和复杂if分支
简单if分支,语法:
if(条件){
满足条件要执行的代码块
}
<?php
/只支持支付宝支付
$choice = ' 支付宝 ' ;
if($choice != ' 支付宝 '){
//条件匹配:用户的选择不是支付宝 $choice != '支付宝' 结果为true
echo ' 目前仅支持支付宝支付 ' ;
exit; //代表代码终止执行
}
?>
标准if分支:
if( ){
}else{
}
复杂if分支:
if( ){
}elseif(){
}elseif(){
.......}else{
}
多条件分支:可使用if嵌套
if分支注意事项:如果条件变换是有序渐进的,那么在编写渐进条件的时候,一定要注意条件变换的顺序性,以及发生条件区间封闭性,如,按照年龄来划分人所处某一类人的时候,一定是最狭窄的条件先判定,最后是最宽的条件
例:
<?php
$age = 50;
if($age <= 20){ //年龄 < 20是最狭窄的
echo ' 青少年 ' ;
}elseif($age <= 20){
echo ' 中年 ' ;
}else{
echo '老年' ;
}
?>
switch分支结构
switch(条件变量){
case 匹配值1:
//满足条件执行的代码块;
break; //结束分支结构
case 匹配值2:
//满足条件执行的代码块;
break; //结束分支结构
……
default:
//条件都不匹配执行的代码块;
break;
}
语法解释:
- 条件变量不是一个运算,是一个纯粹的变量
- 匹配值就是变量可能代表的值
- break是每个case需要的结束符号,如果没有会继续向下执行
- default存在就是在匹配不到的情况下执行,default可以没有,代表匹配不到条件就不做任何事情
switch分支与if分支的区别
- switch分支的条件与if分支不同,if分支比较灵活,可以是变量也可以是运算表达式,而switch只能是变量(而且变量通常是连续的数据)
- if分支的条件是从第一个开始挨个匹配,而switch的逻辑不一样,不需要挨个匹配,是直接到达目标case(因此如果是对于多条件而言,使用switch比if实现效率要高些;如果是简单匹配if效率高)
- if分支匹配,永远最多执行一个代码块(匹配成功的),而switch如果在不使用break情况下,可执行多个条件对应的代码块
流程控制:
分3种,顺序结构,分支结构和循环结构