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

  • 相关阅读:
    高精度计算
    高精度除以低精度
    P1258 小车问题
    POJ 2352 stars (树状数组入门经典!!!)
    HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
    HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
    POJ 1703 Find them, Catch them(确定元素归属集合的并查集)
    HDU Virtual Friends(超级经典的带权并查集)
    HDU 3047 Zjnu Stadium(带权并查集,难想到)
    HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)
  • 原文地址:https://www.cnblogs.com/chenyuan7/p/9481045.html
Copyright © 2011-2022 走看看