PHP基础4--函数-数组

匿名 (未验证) 提交于 2019-12-02 22:11:45

主要

  1. 函数
  2. 数组
  3. 常用系统函数




函数

  基础

  1)定义

1 function 函数名(【$形参1】,【$形参2】,.....) { 2       //函数体   3 }
点击查看函数定义形式

  2) 调用

  3)调用过程

step 1: 将函数调用的实参数据,传递给函数的形参 step 2: 程序进入到函数内部 step 3: 在函数内部,按正常的流程顺序执行里面的代码 step 4: 如果函数结束或遇到return,返回到原来调用函数的位置,继续执行后续的代码
函数调用过程分析

  函数的参数

  1)形参的默认值

  2)形参传值

    实参变量传值给形参变量。两种传值方式

      值传递: 默认。一般参数传值都是值传递

      

  3) 参数的数量

    一般实参数量与形参数量一致。当形参有默认值,可以省略有默认值的实参。但只能从右边往左省略

      依赖于3个系统函数:

        

        func_get_args($i) :

        func_num_args():

      

  函数的返回值

  可以返回数据,也可以不返回

  函数中遇到return语句,自动终止函数的执行,返回到调用函数的位置继续执行后续代码

  函数的形式

 1 <?php  2   3 //可变函数  4     //声明了三个函数  5     function jpg() { echo "<br /> 这是jpg图片<br />"; }  6     function png() { echo "<br /> 这是png图片<br />"; }  7     function gif() { echo "<br /> 这是gif图片<br />"; }  8   9     //模拟上传的文件名 10     $file = "abc.1.2.png";   //用户上传的图片  其后缀可能是png,jpg,gif等 11  12     //strrchr(字符串,指定字符) : 查找指定字符在字符串中最后一次出现直到结尾(包含指定字符) 13     $postfix = strrchr($file,".");     //获取字符串$file中最后一次出现的“.”之后的所有字符串(包含.) 14     echo $postfix;  //结果 .png 15  16     //substr(字符串,开始位置[,长度]) : 返回字符串从开始位置到指定长度的子字符串 17     $postfix = substr($postfix,1);   //获得该字符串从位置1开始之后的所有字符串  既 png 18     $postfix();   //可变函数  调用png()
可变函数Demo

    匿名函数: 没有名字的函数。有两种形式的匿名函数

      形式2: 将匿名函数作为 “实参” 来使用

function add($x,$y,$z){     $sum = $x + $y;     $diff = $x-$y;             $z( $sum,$diff);   //可变函数 } //调用add函数 add(8,5, function($x,$y){     echo "x=$x, y=$y";  //x=13 , y=3 });
匿名函数形式2Demo

  作用域

  php中变量的作用域有3个:

    1) 局部作用域: 函数内部的变量

    2) 全局作用域: 对所有代码范围。 系统预定的超全局数组,如 $_GET, $_POST, $_COOKIE,....

  访问限制:

    1) 局部范围 全局变量

1 $v1 = 1;  //全局变量 2 function f1() {  3     echo "<br />在函数内部访问外部:v1 =".$v1;   //局部范围不能访问全局变量 4 }  5 f1();    //报错   Notice: Undefined variable: v1
局部范围不能访问全局变量Demo

      函数内部的变量,通常调用结束,就被销毁了

1 //2-全局范围不能访问局部变量     2 function f2() { 3     $v2 = 1;    //局部变量 4     return $v2; 5 } 6 $res = f2();  7 echo "在函数外部访问局部变量:v2 =".$v2;  //Notice: Undefined variable: v2
全局范围不能访问局部变量Demo

    3) 特殊的局部变量: 静态变量

      局部范围中静态变量:函数调用后一直存在。

      在函数内部赋予初值,只会执行一次(赋值语句只执行一次)。

 1 <?php  2 /**  3  * 函数中的静态变量特点:  4  *   1.函数调用结束不会被销毁  5  *   2.不管调用几次,函数中的静态变量的赋初值只执行1次,后面的调用会使用函数上次的值  6  */  7     function f () {  8         static $c = 0;   //静态局部变量, 值会保留  9         $c++;            //此数据会持续保留 10         $d = 0;  //普通局部变量,调用结束就会销毁 11         $d++; 12         echo "<br />c = $c, d = $d  "; 13         echo "<br />此函数调用的次数: $c"; 14     } 15     f(); 16     f(); 17     f();  //d值永远不变是1,$c每次调用累加
静态变量demo

      方式1: 使用global关键字

 1 /**  2  *  在局部环境使用全局变量有2种方式:  3  *     方式1: global 全局变量名同名的变量  4  *     方式2: $GLOBALS['全局变量名']  5  *     两者有细微的区别:  $GLOBALS指代的就是全局变量,  6  *         而用global声明的,相当于在函数内部声明了一个同名变量,指向全局变量值的地址,如果unset,只是删除了引用  7  */  8   9 //方式1: global 全局变量名同名的变量 10     $v4 = 4;   //全局变量 11     function f4() { 12         //在函数中使用global来声明一个要使用的全局变量的同名局部变量 13         global $v4; //$v4是局部变量,只是跟全局的$v4同名 14                     //实际情况是: 此时外部v4变量跟内部的v4变量, 15                     //共同指向一个数据区--引用关系 16         echo "<br />在局部访问全局变量v4 = ".$v4;   //4 可以直接调用了 17         $v4 = 100; //改变全局变量的值 18         unset($v4);  //释放函数内部的引用,实际全局变量仍然存在 19     } 20     f4(); 21     echo "<br />在全局再次访问v4=".$v4;  //在函数内部被改变了 22     echo "<hr />";
global方式demo

      方式2: 使用超全局数组变量$GLOBALS

        如果对$GLOBALS变量的某个单元进行unset. 如 unset($GLOBALS['var']); 则其对应销毁该变量($var)

 1 //方式2: $GLOBALS['全局变量名']  2 //使用$GLOBALS超全局变量  3     $v5 = 4;   //全局变量  4     function f() {  5         echo "在局部访问全局变量v5 = ".$GLOBALS["v5"];   //在局部访问全局变量v5 = 4  6         $GLOBALS["v5"] = 100;  7     }  8     f();  9     echo "<br />在全局再次访问v5=".$v5;  //v5=100 10     echo "<br />在全局再次访问v5=".$GLOBALS["v5"];  //v5=100
$GLOBALS方式Demo

  函数编程思想

  递归思想

    递归(迭代)函数: 在函数内部调用自己的函数

1 function recursion($n) { 2         if(最小一级){   return   已知的答案  } 3        $result = 对recursion($n-1)进行简单运算 4        return $result; 5 }        
基本模式

  递推思想

 1 <?php  2   3 // 求5的阶乘  4 //1-初步  5 $recursion1 = 1; //表示1的阶乘(已知)  6 $recursion2 = $recursion1 * 2; //2的阶乘  7 $recursion3 = $recursion2 * 3; //3的阶乘  8 $recursion4 = $recursion3 * 4; //4的阶乘  9 $recursion5 = $recursion4 * 5; //5的阶乘 10  11 //2-使用一个变量实现 12 $recursion = 1;  //表示1的阶乘(已知) 13 $recursion = $recursion * 2; //2的阶乘 14 $recursion = $recursion * 3; //3的阶乘 15 $recursion = $recursion * 4; //4的阶乘 16 $recursion = $recursion * 5; //5的阶乘 17  18 //3-上述递推的规律 19 $recursion = 1;//表示1的阶乘(已知) 20 for($i=2; $i<=5;++$i){ 21     $recursion = $recursion * $i; 22 } 23  24 //4-通过上述思路,进一步转换  ==》 前一个答案,推出后一个答案 25     $pre = 1;  //前一个已知的答案: 这是第一个,1的阶乘 26     for($i = 2; $i <= 5; ++$i) {  //意图求得从2到5的“每一个阶乘” 27         $next = $pre * $i;   //要求的结果是“前一个结果”经过简单乘法运算而得到 28         echo "<br />{$i}的阶乘是{$next}"; 29         $pre = $next;   //将当前求得的“结果”,又当成“前一个”,以供下一次使用 30     } 31     echo "<br />结果为: ".$next;
递推求阶乘demo

   既能使用递归算法解决,又能使用递推算法解决,则因该使用递推算法

 1     <?php  2 /* 数列 1,1,2,3,5,8,13,……  3         说明:  4             第1项是1,第2项是1 (都是已知)  5             其他项,是其前两项的和  6         求: 第20项:  7 */  8 //1-递推规律  9 $pre1 = $pre2 = 1; 10 $result = $pre1 + $pre2;  //第3项 = 第1项 + 第2项 11     $pre1 = $pre2; 12     $pre2 = $result; 13 $result = $pre1 + $pre2;   //第4项= 第2项 + 第3项 14     $pre1 = $pre2; 15     $pre2 = $result; 16 $result = $pre1 + $pre2;   //第5项= 第3项 + 第4项 17  18 //根据上述规律简化 19 $t1 = microtime(true); 20 $pre1 = 1; 21 $pre2 = 1; 22 for($i = 3; $i <= 20; $i++){ 23     $result = $pre1 + $pre2; 24     $pre1 = $pre2; 25     $pre2 = $result; 26 } 27 echo $result; 28 $t2 = microtime(true); 29 echo "<br/>采用递推思想实现耗时:".($t2-$t1); 30  31 /**递归思想实现**/ 32 echo "<hr>"; 33 function  shulie($n) { 34     if(($n == 2) || ($n == 1)) { 35         return 1;  36     } 37     $result = shulie($n-2) + shulie($n-1); 38     return $result; 39 } 40 $t1 = microtime(true); 41 $v1 = shulie(20); 42 echo $v1; 43 $t2 = microtime(true); 44 echo "<br/>采用递归思想实现耗时:".($t2-$t1);
递归与递推耗时比较

数组

  基础

  1) PHP中的数组单元的顺序,与下标无关, 是由其放入的顺序决定。

  2) 定义赋值:

    关联数组,下标是字符串。 如: $arr("a"=>3, "b"=>4);

    下标: 可以任意设定,可以是数字和字符串混合使用。 如果下标重复,后面覆盖前面

      自动下标: 其值为之前所有用过的整数下标的最大值+1

    数组内最后一个逗号可有可无。 如 $arr = array(1,2,3,);

    非常规情况的下标的自动转换

  3) 数组的取值: 如 $val = $arr[1];

  4) 数组的分类: 

      按健值分:索引数组, 关联数组, 混合数组

      按数组的维度分:一维,二维,.....   

        如:$a = array( array(1,2,3), array(4,5,6));

  5) 使用

 1 <?php  2 /**  3  * 求一个一维数组的平均值: 总和/长度  4  */  5         $arr = array(1,11,111,1111);  6         $len = count($arr);    //数组的长度  7         $sum = 0;   //用于存储总和  8         for($i = 0; $i < $len; ++$i) {  9             $sum += $arr[$i]; 10         } 11         echo "<br />平均值为: ".($sum/$len);  //平均值为: 308.5
求一维数组的平均值
 1 /**  2  * 求一个二维数组的平均值: 首先变为一维数组,再求和  3  */  4 $arr = array(   array(1,11,111),  5                 array(2,22,222,2222),  6                 array(3,33,333,3333,33333)  7         );  8 $len = count($arr);    // 二维数组的长度 其实就是行数  9 $sum = 0;   //用于存储总和 10 $c = 0;  //计数 11 for($i = 0; $i < $len; ++$i) { 12     $temp = array(); 13     $temp = $arr[$i];   //存储一维数组 14     $len_temp = count($temp); 15     for($j = 0; $j < $len_temp; ++$j) { 16         $sum += $temp[$j];   //累加 17         ++$c;    //计数 18     } 19 } 20 echo "<br />平均值为: ".($sum/$c);   //平均值为: 3302.1666666667
求二维数组的平均值
 1 <?php  2 /**  3  * 求一个一维数组的最大值: 先假设第一个数组元素是最大值,然后逐个比较得到最大值  4  */  5 $arr = array(13,8,5,11,22,2);  6 $max = $arr[0];   //将第一项放入$max中,用该变量来存储数组中的最大值  7 $key = 0;  //存储最大值的下标  8 $len = count($arr);   //数组长度  9 for($i = 0; $i < $len; ++$i) { 10     if($arr[$i] > $max) { 11         $max = $arr[$i]; 12         $key = $i; 13     } 14 } 15 echo "<br />最大值为: ".$max." 最大下标是: ".$key;
求一维数组的最大值
 1 <?php  2 /**  3  * 求交换一个一维数组的最大值和最小值的位置  4  * 假设第一个数组元素是最大值==》得到值$max和下标$maxIndex  5  * 假设第一个数组元素是最小值==》得到值$min和下标$minIndex  6  * 循环比较,只要比$max大的值,就将大值放到$max中。最小值也是同样形式的处理  7  * 此时就可以得到最大值,最小值及对应索引,交换位置则只需要一个临时变量就可以实现  8  */  9         $arr = array(13,8,5,11,22,2); 10      echo "<br />交换之前: "; 11      print_r($arr); 12         $max = $arr[0];   //将第一项放入$max中,用该变量来存储数组中的最大值 13         $key_max = 0;  //存储最大值的下标 14         $min = $arr[0];  //存储数组最小值 15         $key_min = 0;    //最小值对应的健值 16         $len = count($arr);   //数组长度 17         for($i = 0; $i < $len; ++$i) { 18             if($arr[$i] > $max) { 19                 $max = $arr[$i]; 20                 $key_max = $i; 21             } 22             if($arr[$i] < $min) { 23                 $min = $arr[$i]; 24                 $key_min = $i; 25             } 26         } 27         echo "<br />最大值为: ".$max." 最大下标是: ".$key_max; 28         echo "<br />最小值为: ".$min." 最大下标是: ".$key_min; 29          echo "<br />交换之后: ";  30           $tmp = $arr[$key_max]; 31           $arr[$key_max] = $arr[$key_min]; 32           $arr[$key_min] = $tmp; 33          print_r($arr);
交换一个一维数组的最大值和最小值的位置

  遍历数组

    1) foreach中可以使用break 和 continue

    2) 遍历过程中 值变量 默认的传值方式: 值传递

      $key不能使用引用方式

    4) foreach 默认是在原数组上进行遍历。 如果遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环(原数组保持不变)

1 foreach($数组变量名  as  [$key =>]$value ) { 2      //循环体;  这里可以去使用$key 和 $value 3      //$key 和 $value 就是该遍历语句一次次取得的该数组的每一个单元(项)的下标和对应值。 4      //且,它总是从数组的开头往后顺序取数据 5 }
foreach形式
 1 /**  2  * foreach遍历流程  3  */  4 $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);  5 foreach($arr as $key => $value) {  6     echo "<br/>".$key."=>".$value;  7 }  8 //遍历完成后,此时数组指针位置---超出数组范围  9 $end_key = key($arr); 10 $end_value = current($arr); 11 echo "<br />此时end_key(键)为: ";var_dump($end_key);               //  null 12  echo "<br />此时end_value(值)为: ";var_dump($end_value);      //bool值 false
foreach遍历Demo
<?php //在foreach循环中,”修改数组“--修改不影响遍历的”本来过程“   $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);   foreach($arr as $key => $value) {        echo "<br /> $key : $value";     if($key === 3) {         $arr[99] = "新的数据项";   //循环进入此时,对该数组添加了一项,而且是添加到数组的末尾     }   }   echo "<br />此时,数组新的项已经添加进去了 <br />";   print_r($arr);    $value = current($arr);   //指向'mn'=>18   $key = key($arr);   echo "<br /> 此时数组指针指向的单元为: $key => $value";   //'mn'=>18 echo "<hr/>";     //在foreach使用引用传递,则是在原数组上进行 //值变量使用”引用传递“ 则无论如何都是在原数组中进行   $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);   foreach($arr as $key => &$value) {        echo "<br /> $key : $value";     if($key === 3) {         //使用的引用传递,所以也会遍历出来         $arr[99] = "新的数据项";   //循环进入此时,对该数组添加了一项,而且是添加到数组的末尾     }   }   echo "<br />遍历后也能看出来:  <br />";   print_r($arr);   $value = current($arr);      $key = key($arr);   echo "<br /> 此时数组指针指向的单元为: $key => $value";  
遍历过程位置比较Demo

 for+next()遍历数组

    对PHP数组,往往不能单纯使用for循环进行遍历。

    for循环只能循环"下标为连续的整数的数组"

 1 <?php  2 /**  3  * for+next遍历数组  4  */  5 //使用for循环和next函数,遍历以下数组  6 $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);  7 for($i = 0; $i < count($arr); ++$i) {  //控制循环次数  8     $key = key($arr);       //取得当前的键  9     $value = current($arr); //取得当前的值 10     echo "<br /> $key => $value "; 11     next($arr);   //数据处理完毕后,将数组指针后移动一位 12 } 13 //如果只使用for,则只能针对连续的索引数组有效
for+next遍历数组Demo

一次性取得一个数组中从0开始的数字下标的多个单元的值


      注意: 变量的个数,要跟该数组的数字下标的单元对应,如果某个变量对应的该数组下标不存在,就会报错

<?php /**  * each()函数理解  * 获得的结果是: 0,1索引  key,value关联  */ //each的含义和使用方法 $arr = array(1 => 3, 'a1' => 11, 3 => 5 ); $result = each($arr);    //取得 1=>3这项,  结果是一个数组 /**  * Array (   *     [1] => 3   *     [value] => 3   *     [0] => 1   *     [key] => 1   *   )   */ echo "<br />result为: "; print_r($result); $result2 = each($arr);    //取得 a1=>11这项,  结果是一个数组 echo "<br />result为: "; print_r($result2);
each()函数Demo
 1 <?php  2 /**  3  * list()函数理解  4  *   5  */  6 //list()函数  7 $c = array(0=>0, 1=>11, 3=>33, 2=>22);   8   9 //获得数组第0项的值 10 list($v1) = $c;               //将数组下标为0的项赋值给v1 11 echo "<br />v1 = $v1";                        //v1 = 0 12  13 //获得数组第0,1项的值 14 list($s1,$s2) = $c;           //将数组下标为0,1的项赋值给s1,s2 15 echo "<br />s1 = $s1, s2 = $s2";              //s1 = 0, s2 = 11 16  17 //获得数组第0,1,2项的值 18 list($m1,$m2,$m3) = $c;       //将数组下标为0,1,2的项赋值给m1,m2,m3 19 echo "<br />m1 = $m1, m2 = $m2, m3 = $m3";    //m1 = 0, m2 = 11, m3 = 22
list()函数Demo
 1 <?php  2 /**  3  * list()函数理解  4  * 下面数组中没有索引为1的数组元素,使用list取出2个值时会报错  5  */  6 //list()函数  7   8 $arr = array('value'=>5, 0=>1, 'key'=>1); //此时该数组中没有下标1的数组元素  9  10 //Notice: Undefined offset: 1  11 list($key, $value) = $arr;  //分别取得下标为0,1的数据        下标为1的是没有的 12  13 echo "<br />key = $key, value = $value";    //  key = 1, value =  
list只能取得连续索引数组的值
 1 <?php  2 /**  3  * while+each+list 遍历数组  4  */  5 //while+each+list方式遍历  6 //根据list只能遍历索引数组的特点,使用each取出数组的值,each既能得到数组元素每一项的关联数组也能得到索引数组  7  $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);  8 while(list($key,$value) = each($arr)) {  //模式化的写法  9     echo $key,"=>".$value."<br/>";   //输出 1=>3, a1=>11, 3=>5, mn=>18, 88=>2 10 }
while+each+list遍历数组Demo

  排序  

<?php header("Content-type:text/html;charset=utf-8"); /**  * 数组排序  *     sort($arr): 对数组排序  *         bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )  *         数组单元按升序排序  *         参数2: 排序类型标记,可以设置作为数值或字符串进行比较  *         注意:此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。  *    asort: 对数组进行排序并保持索引关系  *        bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )  *          */ //sort排序     //值是排序了,但健值却丢了         $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);         echo "<br />排序前; "; print_r($arr);         sort($arr);         echo "<br />排序后; "; print_r($arr);  //asort排序         //值排序,健值保留         $arr = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2);         echo "<br />排序前; "; print_r($arr);         asort($arr);         echo "<br />排序后; "; print_r($arr);
sort与 asort排序Demo

  数组操作算法

  冒泡排序

    冒泡排序算法: 一趟趟从左往右进行相邻单元的两两比较,凡是2个元素的顺序不是目标顺序,就将他们进行交换。

1)	从数组的左边开始,依次两两比较相邻的2个数据的大小。  2)	如果发现左边的比右边的大,则将他们进行交换。  3)	这样进行”一趟“之后,必然可以确定最大的一个数据放在最右边  4)	按此方式”对剩余数据“继续进行下一趟,则会确定这些剩余数据的最大值放在剩余位置的最右边
冒泡排序的过程
 1 <?php  2 header("Content-type:text/html;charset=utf-8");  3 /**  4  * 冒泡排序算法  5  *     思路:  6  *         从数组的左边开始,依次相邻两两元素比较,左边大则交换位置,一趟下来,最大值到了最右边  7  *         剩下数据按上述方式继续比较  8  *           9  *     规律总结:( 如假设: $arr= (4,3,1,5);) 10  *         $arr的长度为n(数组有n个元素)      ---此时有4个元素 11  *         比较的趟数: n-1趟                  ---比较3趟 12  *         每一趟比上一趟数据少一个。第一趟比较次数: n-1次      ---第一次比较3次    13  *         左边大于右边则进行位置交换 14  */ 15 //冒泡法排序: 16 $arr = array(9,3,5,8,2,7);  //长度是6 ==》 比较的趟数是5,比较的次数:5,4,3,2,1 既$len-1-$i 17 echo "<br />排序之前: "; print_r($arr); 18 $len = count($arr);   //统计数组的长度 19 for($i = 0; $i < $len -1; ++$i) {   //比较的趟数 20     for($j = 0; $j < $len -1 - $i; ++$j) {   //每趟比较的次数 $j当作下标使用 21         if($arr[$j] > $arr[$j + 1]) { 22             //进行交换 23             $t = $arr[$j]; 24             $arr[$j] = $arr[$j + 1]; 25             $arr[$j + 1] = $t ; 26         } 27     } 28 } 29 echo "<br />排序之后: "; print_r($arr); 30 /** 31  *  for($i = 0; $i < 5; ++$i)  //趟数 32  *      for($j = 0; $j < 5 - $i; ++$j) //每一趟比较的次数 33  *          if($arr[$j] > $arr[$j + 1]) {..} 34  *  第1趟:  9,3,5,8,2,7  =》 3,5,8,2,7,9 35  *  第2趟    3,5,8,2,7,9  =》 3,5,2,7,8,9 36  *  第3趟    3,5,2,7,8,9  =》 3,5,2,7,8,9 37  *  第4趟    3,5,2,7,8,9  =》 3,2,5,7,8,9 38  *  第5趟    3,2,5,7,8,9  =》 2,3,5,7,8,9 39  */
冒泡排序Demo分析

  选择排序

1 1, 求得一个数组的最大值的下标,并将这个最大值下标的单元跟最后一个单元进行交换 2 2,继续从剩余数据中取得最最大值的下标,并将这个最大值下标的单元跟剩余的最后一个单元交换,以此类推,直到只剩一个数据,就不用找了
选择排序过程
<?php header("Content-type:text/html;charset=utf-8"); /**  * 选择排序算法  *     思路:  *         找到所有数组元素中的最大值,与最后一个元素位置进行交换--确定最后一个元素  *         除最后一个元素找剩下的所有元素的最大值,与此时的最后一个元素位置交换(既数组倒数第2个元素)      *         至到最后一个元素后就结束了  *     规律总结:( 如假设: $arr= (4,3,1,5);)  *         $arr的长度为n(数组有n个元素)      ---此时有4个元素  *         第1趟得到最大值,第2趟得到次大值,。。总共的趟数: n-1   ---此时应进行3趟  *         每趟找最大值,后一趟会少一个值。第1趟数据是n个,第2趟数据是n-1,... 第i趟 :n-i  *         每次找到的最大值进行交换位置  */ //选择排序 $arr = array(9,3,5,8,2,7);   echo "<br />排序之前: "; print_r($arr);   $len = count($arr);   //统计数组的长度   for($i = 0; $i < $len -1; ++$i) {   //比较的趟数       //每一趟开始找最大值        $max = $arr[0];   //找最大值的下标,要取得第1项的值        $key = 0;      // 最大值的下标,也要先取得第一项的下标         for($j = 0; $j < $len - $i; ++$j) {               //找到最大值, k也可以理解为下标           if($max < $arr[$j]) {             $max = $arr[$j];             $key = $j;           }         }         //前面一定可以获得最大值及其所在的下标:即最大值单元         // 然后开始进行交换         $t = $arr[$key];         $arr[$key] = $arr[$len-1-$i];  //$len-1-$i 表示最后一个单元         $arr[$len-1-$i] = $t;   }   echo "<br />排序之后: "; print_r($arr); /**  *  for($i = 0; $i < 5; ++$i)  //趟数  *      $max = $arr[0];  *      $key = 0;  *      for($j = 0; $j < 5 - $i; ++$j) //每一趟比较的次数  *          if($max < $arr[$j]) {..}  *  第1趟:  9,3,5,8,2,7  =》 7,3,5,8,2,9  *  第2趟    7,3,5,8,2,9  =》 7,3,5,2,8,9  *  第3趟    7,3,5,2,8,9  =》 2,3,5,7,8,9  *  第4趟    2,3,5,7,8,9  =》 2,3,5,7,8,9  *  第5趟    2,3,5,7,8,9  =》 2,3,5,7,8,9  */
选择排序Demo分析

  二分查找

针对的是索引数组;针对的是已经排好序的数组

1000个数据,约10次找出   100万个数据,约20次找出  10亿个数据,约30次找出  40亿个数据,约32次找出
二分查找算法的效率
 1 <?php  2 /**  3  * 需求: 请找出该数组中是否有22?    4  * 二分查找前提: 针对索引数组,且是排好序的数组  5  */  6 //二分查找算法  7 $arr = array(1,3,11,18,19,22,25,33,34,38,44,55,56,58,60,61,66,70,77,88,90,91,93,95,98);  8 $search = 22; //要找的数据  9 $len = count($arr);   //数组的长度,最大下标为len-1 10 $c2 = 0;   //计数 11  12 //函数功能: 从数组$arr中的位置$begin开始到位置$end之间找数据$target 13 function binary_search($arr,$target,$begin,$end) { 14   $GLOBALS['c2']++; 15     if($end < $begin) { return false; } 16     $midKey = floor(($begin + $end)/2);   //定位中间的位置 17     $midValue = $arr[$midKey];    //取得中间项值 18  19     if($midValue == $target) {   //找的值恰好就是中间的那个 20         return true;  21     } else if($midValue > $target) {  //中间项要比找的$target大,就去左边找 22         $result = binary_search($arr,$target,$begin,$midKey - 1);  23     } else {  //中间项要比找的$target小,就去右边找 24         $result = binary_search($arr,$target,$midKey + 1,$end);  25     } 26     return $result; 27 } 28  29 //使用binary_search()函数从$arr中的0到$len-1位置找$search 30 $v2 = binary_search($arr, $search, 0, $len -1); 31 echo "结果是: "; var_dump($v2);  //bool(true)  32 echo "<br>查询次数:".$c2;  //2
二分查找算法Demo

  字符串函数

  1)字符串截取

strrchr($str,$char) :       查找指定字符$char在 字符串$str  中最后一次出现直至结尾(包含指定字符)  substr($str,$start[,$length]) : 返回字符串$str  从开始位置$start 到指定长度$length的子字符串  strchr() 查找字符串的首次出现  别名: strstr
字符串截取函数说明

  2) 输出与格式化

  3) 字符串去除与填充

trim()  去除两边的空白  ltrim()  去除左边的空白  rtrim() 去除右边的空白  str_pad($str, $length, $str2, $location)  将指定字符串$str, 用字符串 $str2填充到指定的长度$length, 可以指定填充的位置; $location表示填充的方向,左边填充或右边填充。取值: STR_PAD_RIGHT , STR_PAD_LEFT, STR_PAD_BOTH
字符串去除与填充

  4)字符串连接与分割

  5) 字符串替换

子字符串替换

替换字符串的子串

  6) 字符串长度与位置

查找字符串首次出现的位置

    strrpos() 查找指定字符串在目标字符串中最后一次出现的位置

  7) 字符串转换

strtolower() 转换为小写  strtoupper() 转换为大写  lcfirst() 使一个字符串的第一个字符小写  ucfirst() 将字符串的首字母转换为大写  ucwords() 将字符串中每个单词的首字母转换为大写
字符串转换

  8) 特殊字符处理

  有关函数的系统函数

    function_exists(): 判断一个函数是否定义过

    获取传递给函数实参数列表的数组

    function_get_arg($i): 获取传递给函数的第$i个实参

     获取传递给函数的实参数量

  时间函数

  数学函数

  数组函数

    1)指针操作函数

 1 $v = current($数组);    //获得数组的当前指针所在的单元的“值”  2   3 $v = key($数组);    //获得数组的当前指针所在的单元的“健”(下标)  4   5 $v = next($数组);    //先将数组的指针移向下一个单元,然后取得该新单元的值。  6   7 $v = prev($数组);    //先将数组的指针移向前一个单元,然后取得该单元的值。  8   9 $v = end($数组);    //先将数组的指针直接移向最后一个单元,  然后取得该单元的值。 10  11 $v = reset($数组);    //先将数组的指针直接移向第一个单元,  然后取得该单元的值。
指针操作函数

 array_pop($arr) 将数组最后一个单元弹出,数组长度减1  array_push($arr,$var,..) 将1个或多个单元压入数组的末尾     array_shift($arr)   将数组开头的单元移出数组  array_unshift($arr,$var,..) 将1个或多个单元压入数组的开始   array_slice()  从数组中取出一段   (参数类型substr函数)默认重新排序并重置数字索引。可以通过第3个参数设置为true改变该行为  array_splice() 把数组的一部分去掉并用其他值代替 (不设置第4个参数,其实就类似array_slice函数)
单元操作函数

 1 sort(): 默认按升序排序,删除键值重新赋予索引健值  2   3 asort(): 默认升序排序,保留原来的健值对  4   5 ksort(): 对数组按键名排序  6   7 usort():使用用户自定义的比较函数对数组中的值进行排序  8   9 rsort(): 数组逆向排序  10  11 arsort(): 保留健值对的逆向排序 12  13 krsort(): 键逆向排序 14  15 shuffle()  将数组打乱
排序函数

    4) 查找函数

1 in_array(): 检查数组中是否存在某个值 2 array_key_exists():给定的键名是否存在于数组中 3 key_exists(): 是array_key_exists的别名 4 array_search();在数组中搜索给定的值,成功则返回相应的键名
查找函数

    5) 其他相关

 1 count(): 别名sizeof,数组单元的数目  2   3 array_reverse():  返回一个单元顺序相反的数组   4   5 array_merge(): 数组合并  6   7 array_sum(): 计算数组中所有值的和  8   9 array_keys(): 返回数组中部分或所有的键名 10  11 array_values():返回数组中所有的值 12  13 array_map(): 将回调函数作用域给定的数组单元上 14  15  array_walk():使用用户自定义函数对数组中的每个元素做回调处理 16  17 range():建立一个包含指定范围单元的数组 
其他相关说明          
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!