批改状态:合格
老师批语:总结的很好,我们可以根据已经提供的数组函数,组合出各式各样数组操作函数,只有你想不到没有它做不到。
array():用于创建数组,示例如下:
<?php// 创建数组$stu = array('jack','male',30);print_r($stu); // 输出 Array ( [0] => jack [1] => male [2] => 30 )// 实际操作中,往往会省略这个函数,用中括号代替$stu = ['alice','female',20];print_r($stu); // 输出 Array ( [0] => alice [1] => female [2] => 20 )
array_keys() :获取数组中的所有键名,并返回一个新的数组
<?php$cars = ['BMW' => 'X6', '丰田' => '卡罗拉', '长安' => '逸动', '现代' => '索拉塔'];// array_keys:获取数组中的所有键名,并返回一个新的数组print_r(array_keys($cars));// 输出 Array ( [0] => BMW [1] => 丰田 [2] => 长安 [3] => 现代 )
array_key_exists():检查某个键名是否存在,返回布尔值
<?php$cars = ['BMW' => 'X6', '丰田' => '卡罗拉', '长安' => '逸动', '现代' => '索拉塔'];echo array_key_exists('BMW',$cars) ? '存在' : '不存在'; //输出 存在echo array_key_exists('BMW111',$cars) ? '存在' : '不存在'; //输出 不存在
key():返回当前指针位置的键名
<?php$cars = ['BMW' => 'X6', '丰田' => '卡罗拉', '长安' => '逸动', '现代' => '索拉塔'];// key():返回当前指针位置的键名,默认从0开始echo key($cars); // 输出 BMW// next():指针下移next($cars);echo key($cars); // 输出 丰田
array_key_first():返回数组中第一个元素的键名
array_key_last():返回数组中最后一个元素的键名
<?php$cars = ['BMW' => 'X6', '丰田' => '卡罗拉', '长安' => '逸动', '现代' => '索拉塔'];echo array_key_first($cars); // 输出 BMWecho array_key_last($cars); // 输出 现代
in_array():检查数组中是否存在指定的值,返回布尔值
<?php$pets = ['dog' => '旺财', 'cat' => '花花', 'pig' => '佩奇'];var_dump( in_array('佩奇',$pets)); // truevar_dump( in_array('汤米',$pets)); // false
array_values():返回数组中所有元素的值,并返回一个新的索引数组
<?php$pets = ['dog' => '旺财', 'cat' => '花花', 'pig' => '佩奇'];print_r(array_values($pets));// 输出 Array ( [0] => 旺财 [1] => 花花 [2] => 佩奇 )
array_search():找到数组中元素含有指定值的键名并返回,若找不到,返回false
<?php$pets = ['dog' => '旺财', 'cat' => '花花', 'pig' => '佩奇'];echo array_search('佩奇',$pets) ; // 输出 pigvar_dump(array_search('佩奇22',$pets)) ; // 返回false// 该函数有第三个值,默认是false,若是true,表示搜索的值数据和类型都要一致,如下:$nums = ['a' => 10, 'b' => '10', 'c' => '10' ];// echo array_search(10,$nums,true); // 输出 a// echo array_search('10',$nums,true); // 输出 b ,表示只搜索一次,搜到了就返回了// 可以利用循环来搜索foreach( $nums as $keys => $values ){if($values === '10')echo $keys;} // 输出 bc
array_sum():返回数组中所有值的和
<?php$nums = [10,20,30,'10'];echo array_sum($nums); // 返回 70,表示在运算时会将字符串自动转换为数值类型echo array_sum([10,20,'30aa']); // 返回 60echo array_sum([10,20,'aa30']); // 返回 30echo array_sum([10,20,true]); // 返回 31,表示布尔值也会转换,true为1,false为0echo array_sum([10,20,NULL]); // 返回 30// 利用循环来求和$sum = 0;foreach ( $nums as $values ) {$sum += $values;}echo $sum; // 输出 70
array_product():计算并返回数组中所有元素的值的乘积
<?php$nums = [2,5,'5'];echo array_product($nums); // 输出 50echo array_product([2,5,'5',false]); // 输出 0 ,和求和一样,数据类型会自动转换// 利用循环求乘积$product = 1;foreach ( $nums as $values ) {$product *= $values;}echo $product; // 输出 50
count():计算并返回数组的长度
<?phpecho count([1,2,3,4,5,6,7,8,9,10]); // 返回 10echo count([1,2,3,true,NULL,'88']); // 返回 6
<?php// 栈与队列// 栈的原理:先进后出 LIFO// 队的原理:先进先除 FIFO// array_push():将一个或多个元素插入数组的末尾(入栈),返回值是新的数组的长度// array_pop():删除数组中的最后一个元素(出栈),返回值是被删除的元素// array_unshift():在数组开头插入一个或多个元素,返回值是新的数组的长度// array_shift():删除数组中的第一个元素,并返回被删除元素的值。$arr = [ 'yellow', 'red', 'green' ];// 1. 栈的尾部进行增删// 入栈 ,先进black,再进purplearray_push ( $arr, 'black', 'purple' );print_r ( $arr );// 出栈array_pop ( $arr); //第一次出栈的是:后进的purpleprint_r($arr);array_pop ( $arr); //第二次出栈的是:先进的blackprint_r($arr);// 2. 栈的头部进行增删// 入栈 ,先进blue,再进pinkarray_unshift ( $arr, 'pink', 'blue' );print_r ( $arr );// 出栈array_shift ( $arr ); // 第一次出栈的是:后进的pinkprint_r ( $arr );array_shift ( $arr ); // 第二次出栈的是:先的进的blueprint_r ( $arr );

<?php// 3. 队列的尾部进行增删:尾部进队,头部出队$arr = [];// 尾部进队,顺序:a --> b --> carray_push( $arr, 'a', 'b', 'c');print_r($arr);// 头部出队,顺序:a --> b --> carray_shift($arr); // 第一次出队的是先进的aprint_r($arr);array_shift($arr); // 第二次出队的是bprint_r($arr);array_shift($arr); // 第三次出队的是cprint_r($arr);// 4. 队列的头部进行增删:头部进队,尾部出队// 头部进队,顺序:z --> y --> xarray_unshift( $arr, 'x', 'y', 'z');print_r($arr);// 尾部出队,顺序:z --> y --> xarray_pop($arr);print_r($arr);array_pop($arr);print_r($arr);array_pop($arr);print_r($arr);

<?php// sort():对数组数值升序排列// rsort():对数组数值降序排列// asort():对关联数组按照键值升序排列// arsort():对关联数组按照键值降序排列// ksort():对关联数组按照键名升序排列// krsort():对关联数组按照键名降序排列// usort():由用户自定义函数对数组进行排序// uasort():由用户自定义函数对关联数组的键名进行排序// uksort():由用户自定义函数对关联数组的键值进行排序// natsort():用自然排序算法对数组排序// natcasesort():用自然排序算法对数组进行不区分大小写字母的排序
<?php// 示例一:对索引数组进行升序,降序,自定义排序$arr = [55,36,89,'abc','ppp'];print_r($arr);// 1. 升序sort($arr);print_r($arr);// 2. 降序rsort($arr);print_r($arr);// 3. 自定义升序usort($arr, function ($a, $b) {if ($a==$b) return 0;return $a < $b ? -1 : 1;});print_r($arr);// 4. 自定义降序usort($arr, function ($a, $b) {if ($a==$b) return 0;return $a < $b ? 1 : -1;});print_r($arr);

<?php// 示例二:对关联数组的键名和键值排序$arr = ['20'=>5, '10'=>'15', 'aaa'=>'8', 'dd'=>38];// 1. 对键名升序ksort($arr);print_r($arr);// 2. 对键名降序krsort($arr);print_r($arr);// 3. 对键值升序asort($arr);print_r($arr);// 4. 对键值降序arsort($arr);print_r($arr);

<?php// 示例三:自定义函数对关联数组按照键名和键值排序$arr = ['20'=>5, '10'=>'15', 'aaa'=>'8', 'dd'=>38];// 1. 自定义函数按照键名升序排列uksort($arr, function ($a, $b) {if ($a==$b) return 0;return $a < $b ? -1 : 1;});print_r($arr);// 2. 自定义函数按照键值降序排列uasort($arr, function ($a, $b) {if ($a==$b) return 0;return $a < $b ? 1 : -1;});print_r($arr);

<?php// 示例四:用自然算法对数组排序,只排列键值,不影响键名// 1.使用natsort()$pics = ['pic5.jpg', 'pic8.jpg', 'pic12.jpg', 'pic9.jpg'];sort($pics);print_r($pics);natsort($pics);print_r($pics);// 2. 使用natcasesort()$pics = ['pic5.jpg', 'PIC8.jpg', 'pic12.jpg', 'pic9.JPG'];natsort($pics);print_r($pics);natcasesort($pics);print_r($pics);

array_slice():返回数组选定的部分,不影响原始数组
<?php$arr = ['one', 'two', 'three', 'four', 'aa' => 'five'];// 传两个参数,表示从起始位置截取到末尾print_r(array_slice($arr, 2));// 传三个参数,表示从起始位置开始截取的个数print_r(array_slice($arr, 2, 2));// 传入四个参数,最后一个参数默认是true,保留键名,若为false,表示不保留键名print_r(array_slice($arr, 1, 3, false));

array_splice():从数组中移除并返回选定的元素,会影响原始数组,实现增删改
<?php$arr = ['one', 'two', 'three', 'four', 'aa' => 'five'];// 传入两个参数,表示从起始位置开始移除到末尾(删除)print_r(array_splice($arr, 3));print_r($arr);// 传入三个参数,表示从起始位置开始移除,移除几个,若第三个参数为0,表示不移除,即不变$arr = ['one', 'two', 'three', 'four', 'aa' => 'five'];print_r(array_splice($arr, 2, 2));print_r($arr);// 传入四个参数时,表示可将第四个参数(数组或字符串)从移除的起始位置开始插入到数组(替换)$arr = ['one', 'two', 'three', 'four', 'aa' => 'five'];$nums = [10,20,'aaa','bbb'];print_r(array_splice($arr, 1, 2 ,$nums));print_r($arr);// (新增):需要把第三个参数设置为0,比如:$arr = ['one', 'two', 'three', 'four', 'aa' => 'five'];print_r(array_splice($arr, 1, 0, [666,888]));print_r($arr);

array_map:将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组
<?php// 示例:将数组中的所有值全部增大1倍,包括数组中的数组$nums = [2,3,5,[2,3,5]];print_r(array_map( function ($a) {if ( gettype($a) === 'array' ) {$nums1 = array_map(function($b){return $b*$b;},$a);return $nums1;}return $a*$a;} , $nums));

array_merge():用于把一个或多个数组合并为一个数组
<?php// 当只有一个参数且数组的键名为整数数值时,键名会从0重新开始索引$arr = ['5'=>10, '10'=>20];print_r(array_merge($arr));$arr1 = ['id1' => 1001, 'name1' => 'Jack', 'hobby' => 'book'];$arr2 = ['id2' => 1002, 'name2' => 'Alice', 'hobby' => 'fish'];// 如果两个数组中有相同键名,那么后者的值会覆盖前者print_r(array_merge($arr1, $arr2));// array_merge_recursive():此函数和array_merge()不一样的是:遇到相同键名,不会覆盖,而是递增为一个新数组$arr1 = ['id1' => 1001, 'name1' => 'Jack', 'hobby' => 'book'];$arr2 = ['id2' => 1002, 'name2' => 'Alice', 'hobby' => 'fish'];print_r(array_merge_recursive($arr1, $arr2));

array_combine():通过合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组的元素为键值
<?php$arr1 = ['dog', 'cat', 'pig'];$arr2 = ['旺财','汤姆','佩奇'];// 第一个参数表示键名,第二个参数表示键值print_r(array_combine($arr1,$arr2));

array_filter():只返回能够将数组中元素转为true的元素,然后组成新的数组,数组键名保持不变
<?php$arr = [10,'15','0',0,'1',true,false,null,'',[],'aaa'];$result = array_filter($arr,function ($item) {return $item;});print_r($result);// [], null, false,'', 0, '0' : 转为false

compact():将一组变量变为关联数组
<?php$name = 'Mr Long';$height = 180;$face = 'handsome';print_r(compact('name', 'height', 'face'));

extract():将关联数组拆分为变量,可以直接访问变量
<?php$info = ['id'=>1001, 'name'=>'Jack', 'email'=>'8888@qq.com'];extract($info);echo $id.','.$name.','.$email;

array_unique():删除数组中重复的值,然后返回新的数组
<?php$arr = ['a'=>10, 'b'=>20, 'c'=>10];print_r(array_unique($arr));

<?php$arr = [10,20,30,50,60,70];// current():当前指针位置对应的值echo current($arr),'<hr>';// next():指针下移到下一个位置echo next($arr),'<hr>';echo next($arr),'<hr>';// prev():指针上移echo prev($arr),'<hr>';// end():指针移动到最后一个位置echo end($arr),'<hr>';// reset():指针复位,回到第一个位置echo reset($arr);

数组函数没有全部举例,剩下的函数自己花时间再挨个写写,在过程中,我发现有的函数实现的功能可能并不能达到用户的需求,需要用户自定义函数,另外,有的函数利用循环也能实现其功能,总之,对于一个函数,我们要了解的是其功能,参数及其返回值,然后函数之间有的也可以相互嵌套,需要灵活运用。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号