1. PHP数组函数
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); // 输出 BMW
echo array_key_last($cars); // 输出 现代
- 和值相关函数:
in_array()
:检查数组中是否存在指定的值,返回布尔值
<?php
$pets = ['dog' => '旺财', 'cat' => '花花', 'pig' => '佩奇'];
var_dump( in_array('佩奇',$pets)); // true
var_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) ; // 输出 pig
var_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']); // 返回 60
echo array_sum([10,20,'aa30']); // 返回 30
echo array_sum([10,20,true]); // 返回 31,表示布尔值也会转换,true为1,false为0
echo 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); // 输出 50
echo array_product([2,5,'5',false]); // 输出 0 ,和求和一样,数据类型会自动转换
// 利用循环求乘积
$product = 1;
foreach ( $nums as $values ) {
$product *= $values;
}
echo $product; // 输出 50
count()
:计算并返回数组的长度
<?php
echo count([1,2,3,4,5,6,7,8,9,10]); // 返回 10
echo 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,再进purple
array_push ( $arr, 'black', 'purple' );
print_r ( $arr );
// 出栈
array_pop ( $arr); //第一次出栈的是:后进的purple
print_r($arr);
array_pop ( $arr); //第二次出栈的是:先进的black
print_r($arr);
// 2. 栈的头部进行增删
// 入栈 ,先进blue,再进pink
array_unshift ( $arr, 'pink', 'blue' );
print_r ( $arr );
// 出栈
array_shift ( $arr ); // 第一次出栈的是:后进的pink
print_r ( $arr );
array_shift ( $arr ); // 第二次出栈的是:先的进的blue
print_r ( $arr );
<?php
// 3. 队列的尾部进行增删:尾部进队,头部出队
$arr = [];
// 尾部进队,顺序:a --> b --> c
array_push( $arr, 'a', 'b', 'c');
print_r($arr);
// 头部出队,顺序:a --> b --> c
array_shift($arr); // 第一次出队的是先进的a
print_r($arr);
array_shift($arr); // 第二次出队的是b
print_r($arr);
array_shift($arr); // 第三次出队的是c
print_r($arr);
// 4. 队列的头部进行增删:头部进队,尾部出队
// 头部进队,顺序:z --> y --> x
array_unshift( $arr, 'x', 'y', 'z');
print_r($arr);
// 尾部出队,顺序:z --> y --> x
array_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);
2. 总结
数组函数没有全部举例,剩下的函数自己花时间再挨个写写,在过程中,我发现有的函数实现的功能可能并不能达到用户的需求,需要用户自定义函数,另外,有的函数利用循环也能实现其功能,总之,对于一个函数,我们要了解的是其功能,参数及其返回值,然后函数之间有的也可以相互嵌套,需要灵活运用。