zoukankan      html  css  js  c++  java
  • 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种,顺序结构,分支结构和循环结构

  • 相关阅读:
    实现一个程序两套快捷键
    SystemC中文教程一
    logback的使用和logback.xml详解
    mysql语句练习50题
    Intellij IDEA中使用Debug调试详解
    用node-webkit把web应用打包成桌面应用
    Idea导入项目详解
    iReport 5.6.0 Error: net.sf.jasperreports.engine.JRException: Error executing SQL statement for : data 最优解决方案
    CentOS 7.X 关闭防火墙
    将 MySQL root 的远程访问密码由空密码改为 password
  • 原文地址:https://www.cnblogs.com/chenyuan7/p/9481045.html
Copyright © 2011-2022 走看看