PHP(四)-函数 数组介绍

Posted by Suzeyu on 2016-04-18

自学小笔记

函数

函数的基础

函数的定义:

function 函数名 ([$ 形参1][,$ 形参2]){
    //函数体
}

因为js php 都是动态赋值,创建也不需要声明类型。而是根据内容而定,所以在定义函数的时候,形参不需要加参数类型。

php中可以在定义形参的时候设置默认值,如果设置了默认值,在使用的时候可以不添加实参。

函数的参数

php中声明函数的时候可以设置,形参的传递类型,在形参的前面加上&符号,即可实现引用传递(默认是值传递),声明了引用传递必须要传递变量。使用了引用传递会改变传递进来的参数的最终结果,而值传递只相当于复制了一份值丢进函数,引用是把自己丢进去。

//演示函数引用参数传递
function f2($i , & $j){
    $i = $i * $i;
    $j = $j * $j;
    return $i + $j;
}

$va_1 = 3;
$va_2 = 4;

$result_f2 = f2($va_1, $va_2);
//最终  $va_1 = 3, $va_2 = 16

php中可以定义函数特殊形式,不指定接收的形参,单却可以接收所有的实参。系统中也有类似的函数。比如,获取变量的类型和值的var_dump()

  • var_dump($1);
  • var_dump($2,$3,$4);

    //定义一个没有形参的函数,但是却能截取到传递进来的所有实参
    function f3(){
        //使用系统函数可以获取到函数调用时传递过来的所有参数
        $arr = func_get_args();
        echo "函数被调用的参数:";
        foreach ($arr as  $value) {
            echo $value.", ";
        }
    echo "<hr>";
    }
    
    f3(1,2,3,true,1.2,"abc");
    f3(222,"-");
    

这样的函数依赖于以下三种系统函数。

* func_get_args();    //获取实参数据列表,成为一个数组
* func_get_arg($i);    //获取第$i个实参数据,$i从0开始算起,有风险出现角标越界。可配合以下使用
* func_num_args();    //获取实参的数量。

函数的返回值

同js一样,需要返回值就在return后面追加要返回的即可,retrun 本身作用立即结束掉此函数的执行。

函数的其他形式

可变函数: 一个函数的名字是一个变量。(可变变量,例:$$v1. 一个变量的名字是一个变量)

匿名函数: 没有函数名的函数。

有两种形式:

  1. 将匿名函数赋值给一个变量, 调用时使用 变量();即可调用。
  2. 直接将一个匿名函数,当做实参来使用,在另执行另一个函数时,使用一个匿名函数来当做实参。类似与javanew runnble ,接口回调等。

变量的作用域问题

php中可以分为三种变量作用域:

1.局部作用域:

  • 就是指一个函数的内部范围。
  • 对应这样的变量,理解为局部变量

2.超全作用域

  • 就是所有代码范围,这样的变量称为超全局变量。
  • 主要是系统预定义的几个: $_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES.

3.全局作用域

  • 就是不在函数内部的范围,函数外部。对应这样的变量,就称为全局变量。

通常情况

  • 全局范围不能访问局部变量
  • 局部范围不能访问全局变量

php中也存在静态变量 ,在变量名$前面使用static声明。

  • 静态变量一旦声明赋值后,以后再执行就不会再重新声明并赋值了。常用于统计函数调用次数。

如果想在局部范围访问全局变量。

1 使用global,创建一个同名的局部变量。

$temp_1 = 10;
echo "定义的全局变量=".$temp_1."<br/>";
function visitVar(){
    // 使用global声明一个全局变量,并在局部范围创建一个同名的局部变量, 这两个变量同时指向同一块数据存储块的数据。
     global $temp_1;
     echo "在局部访问的全局变量<br/>";
     // 对局部变量指向的值进行更改,同时可以修改全局变量的值,因为他们是指向相同的内存地址。
     $temp_1 = "修改成功";
}
visitVar();
echo "在全局范围在此访问,全局变量:".$temp_1;

2.使用$GLOBALS['变量名']

在内部使用$GLOBALS[]可以访问函数外定义的全局变量。

  • 此时在函数内部如果使用unset(),那么函数外的常量值也会被修改,这点和使用global声明并在创建一个同名局部变量的方法不同。

有关函数的系统函数

* function_exists()            //判断函数是否存在
* func_get_arg()            //获得实参中的某一个
* func_get_args()            //过得所有实参 并添加一个数组返回
* func_num_args()            //过得所有实参的个数

字符串函数

* 输出与格式化: echo, print, printtf, print_r, var_dump
* 字符串去除与填充: trim, ltrim, rtrim, str_pad
* 字符串连接与分割: implode, join, explode, str_split
* 字符串截取: substr, strchr, strrchr
* 字符串替换: str_replace, substr_replace
* 字符串长度与位置: strlen, strpos, strrpos
* 字符串转换: strtolower, strtoupper, lcfirst, ucfirst, ucwords
* 特殊字符串处理: nl2br,addslashes, htmlspecialchars,htmlspecialchars_decode

时间函数

time,microtime,mktime,date,idate,strtotime,date_add,date_diff,date_default_timezone_set,date_default_timezome_get

数学函数

* max, min, round, ceil, floor, abs, sqrt, pow, rand

函数的编程思想

递归思想–递归函数

特征: 在一个函数内部调用它自己的函数。并且在某一个时刻会停止下来。

需求: 1, 1, 2, 3, 5, 8, 13…. 每一项都是前两项的和。那么第二十项是多少?

function add($count){
    if($count ==1 || $count==2){
        return 1;
    }
    return add($count-1) + add($count-2);
}

特点,由外进内,由内的外。 耗性能

php中也有和meta一样的函数,告诉浏览器,用什么编码显示本网页
header("Content-Type: text/html; charset=UTF-8");

数组

含义:

  • 数组就是一系列数据的集合体,他们按设定的顺序排列为一个”链的形状”.
  • 注意 php的数组单元的顺序,跟下标无关。

数组的定义:

* $arr1 = array(3,5,6,8);   //默认下标,从0开始。和java中的list相似。
* $arr2 = array("a"=>3,"b"=>11,"cc"=>18); //关联数组,下标为字符串 和java map类似。
* $arr3 = array(1=>2,2=>3)    下标也可以混合使用。

下标如果重复那么就会覆盖。

php中,数组单元的顺序,是由其放入的顺序决定,而不是下标。

按键值得关系来分

索引数组: 通常认为,如果一个数组的下标是严格按照从0开始的连续的整数作为下标,则称其为索引数组,就是类似于js数组的下标。

关联数组: 通常认为,如果一个数组的小标都是一个字符串并在一定程度上表名了该单元的含义则称为关联数组。

混合数组: 既有数字下标, 也有字符下标的情况。

数组的遍历

foreach基本语法

foreach($arr as $key => $value){
    //使用$key $value  得到想要的值
}

数组指针的常规使用

* $v1 = current($数组);    //获得数组的当前指针所在的"值"
* $v2 = key($数组);        //获得数组的当前指针所在的"键"(下标)
* $v3 = next($数组);        //获得数组的指针先下移动一个单元,然后取得新的单元值
* $v4 = prev($数组);        //获得数组的当前指先向上移动一个单元,然后去的新的单元值
* $v5 = end($数组);        //获得数组的当前指针移动到最后一个单元,然后取得新单元的值
* $v6 = reset($数组);    //获得数组的当前指针移动到第一个单元,单后取得新的单元值

数组的遍历方式

php中因为键的灵活性,往往不能单纯的for循环遍历。除非下标为连续的纯数字数组。

  • foreach
  • for + next
  • for + list

each()函数的使用

each()函数的作用: 先取一个数组的 当前单元 的下标和值(并放入一个数组),然后将指针移到下一个单元。

each取到的值为一个数组:例如

//一个数组的第一个元素为角标1,元素值3
array里面有四个值
key value 0 1     key和0 的值相同   value和1 的值相同

数组变量的一些细节

  • foreach也是征程的循环语法结构,可以与breakcontinue等操作。
  • 遍历过程中值变量默认的传值方式是值传递。
  • 遍历过程中值变量可以人为的设定为引用传递。
  • foreach默认是原数组上进行遍历,如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后再复制的数组上继续遍历循环。
  • foreach中如果值变量是引用传递,则无论如何都是在原数组上进行的。

数组的查找算法

所谓查找算法, 大体主要是解决这样一个问题: 找出某个数组中,是否存在某个值(数据)。

顺序查找

遍历整个数组,一个一个判断,如果相等,就表示有,然后退出即可。

二分查找算法

  1. 针对的是索引数组。
  2. 针对的是已经排好序的数组

关于效率问题:

  • 21E个数据,约为32次找出
  • 100W个数据,约20次