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);  //自动转换不会改变数据本身的数据类型

 

//字符串转换成数值规则

  1. 第一个字符是字母或其他特殊符号,结果为0
  2. 第一个字符是数字,可依此往后保留,直到不是数字为止
  3. 如果在数字往后推的情况下,碰到第二个小数点结束(保留一个小数点)

?>

强制转换:

<?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种,顺序结构,分支结构和循环结构

 

posted @ 2018-08-15 14:03  糖分控  阅读(245)  评论(0编辑  收藏  举报