入门 - 常用数组函数

  1. int count($array) 统计数组的元素个数
  2. boolean in_array($checkValue, $array) 判断一个值是否在数组元素里
  3. string implode($glue, $array) 将数组的元素用指定符号连接成字符串
  4. array explode($delimiter, $string) 将一个字符串按照指定的符号作为界线分割成多个元素,返回些元素的数组
  5. array_key_exists($key, $array) 判断一个键是否在数组里
  6. mixed array_pop($array) 弹出数组的最后一个元素并返回它
  7. mixed current($array) 获取数组当前内部游标所指的元素
  8. array array_map($callback, $array) 用$callback处理$array的每一个元素
  9. array array_diff($array1, $array2, [, $array ...]) 计算数组的差集
  10. array array_intersect($array1, $array2) 计算数组的交集
  11. array array_keys($array1, $array2) 返回数组中部分的或所有的键名
  12. list($var1, $var2...) = $array
  13. boolean shuffle($array) 打乱数组元素的顺序
  14. extract($array) 根据数组的key名称创建一个相应名称的变量,key的值就是变量的值
  15. mixed key($array) 返回当前游标所指的元素的键名
  16. array array_merge($array1, $array2, [$array...]) 合并数组
  17. int array_push($array, $var) 向数组末尾追加一个新的元素
  18. bool array_walk($array, $callback) 使用用户自定义函数对数组中的每个元素做回调处理,作用和for循环一样,有人提到这个函数比for循环还高效,我测了一下1亿次for循环反而是这个函数效率慢点,但总体误差可以说是人类感知不到的
  19. mixed array_rand($array, $num = 1) 从数组中随机取出一个或多个单元,个数由第2个参数控制
  20. array_reverse($array, $preserve_keys = false) 将一个数组的元素顺序反转,比如元素是2 6 7的话反过来就是7 6 2咯
  21. mixed array_search($needle, $array) 在数组中搜索给定的值,如果成功则返回相应的键名
  22. mixed array_shift($array) 将数组开头的元素移出数组
  23. array array_slice($array, $offset, $length = null) 裁剪数组,跟substr的使用理念一样,参数也几乎一样
  24. int array_sum($array) 计算数组中所有第一层元素相加的和
  25. array array_unique($array, $sort_flags = SORT_STRING) 去除数组中重复的值
  26. int array_unshift($array, $var) 与array_push相反,将一个元素压入数组的顶部,成为第一个元素
  27. bool array_multisort(array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]]) 对多个数组或多维数组进行排序
  28. array array_values($array1, $array2) 返回数组中所有的值(不包含key)
  29. bool sort($array, $sortFlag = SORT_REGULAR) 对数组进行排序
  30. bool rsort(array &$array, int $sort_flags = SORT_REGULAR) 对数组逆向排序,其实就跟sort的结果相反sort是升序的,这个排序后是降序的
  31. bool asort(array &$array, int $sort_flags = SORT_REGULAR) 对数组进行排序并保留key
  32. bool arsort(array &$array, int $sort_flags = SORT_REGULAR),的rsort函数一样将数组降序列,但会保留key
  33. ksort(array &$array, int $sort_flags = SORT_REGULAR) 按照键名升序排序,并保留key => value的关系
  34. krsort(array &$array, int $sort_flags = SORT_REGULAR) 和上面ksort相反,将key按字母降序排列
  • 作者:KK

  • 发表日期:2016.12.21


PHP写程序除了经常对字符串进行加工,还要经常对数组进行加工计算,所以了解你将会经常用到哪些数组函数,注意记住哪些数组函数很重要

放心,常用数组函数不过10个左右,但重点是要了解它们的工作逻辑性

常用数组相关函数清单:

int count($array) 统计数组的元素个数

索引数组和关联数组都可以,但非数组通常会返回1(详细了解),而且我接触的新手写的代码极大多数都会踩中这个坑

例子:

$arr = ['a', 7, 'jfhrfewh', 'x' => 8];
echo count($arr); //  4

使用频率:一个中小型项目里会使用50次以上


boolean in_array($checkValue, $array) 判断一个值是否在数组元素里

$checkValue = '小明';
$names = ['老明', '小明', '幼明', '还没出生叫人怎么明'];
if(in_array($checkValue, $names)){
	echo '小明在里面!';
}else{
	//...
}

使用频率:中小型项目里大概会用30~50次以上


string implode($glue, $array) 将数组的元素用指定符号连接成字符串

$arr = ['a', 'x', 'q'];
echo implode('|', $arr); //  a|x|q

但是被连接的数组元素不能是数组,只能是字符串或者数字

使用频率:中小型项目里大概会用20次左右


array explode($delimiter, $string) 将一个字符串按照指定的符号作为界线分割成多个元素,返回些元素的数组

$str = '哈哈,你真可爱。可是你知道吗,世界不是那么的美好。社会就是黑暗的呀';
$arr = explode('。', $str);
print_r($arr);

//输出结果:
Array
(
	[0] => 哈哈1] => 可是你知道吗你知道吗2] => 社会就是黑暗的呀

就是以句号为分割标记,将句子分割成多段,而分割出来的元素是不会包含句号这个分割标记的

使用频率:中小型项目里大概会用20~30次左右


array_key_exists($key, $array) 判断一个键是否在数组里

$user = [
	'name' => 'Jay',
	'age' => 18,
];
if(array_key_exists('name', $user)){
	echo '这个用户有名字';
}

使用频率:中小型项目里大概会用15~30次


mixed array_pop($array) 弹出数组的最后一个元素并返回它

$arr = [1, 8, 77];
$last = array_pop($arr);

echo $last; //77
print_r($arr); // 剩下 1 8 两个元素

使用频率:中小型项目里大概会用5~10次


mixed current($array) 获取数组当前内部游标所指的元素

我要结合next和reset函数来解说数组内部有“游标”这个概念

$arr = ['a', 'u', 'x'];
echo current($arr); //  a
next($arr); //游标下移到一个元素
echo current($arr); //  u
next($arr); //再下移
echo current($arr); //  x
reset($arr); //重新恢复到第一个游标
echo current($arr); //  a
end($arr); //将游标移到最后
echo current($arr); //  x

不废话解释以上代码,相信你懂了

使用频率:中小型项目里大概会用3~10次,其中reset、next和end三个修改游标的函数几乎是用不上的,用到时再查手册即可,但面试题可能会遇到


array array_map($callback, $array) 用$callback处理$array的每一个元素

可以理解为一个for循环的变相实现

$arr = [1, 8, 77];
$newArr = array_map(function($arrItem){
	return $arrItem += 1;
}, $arr);

print_r($newArr);

//结果如下,全部都+1了

Array
(
	[0] => 2
	[1] => 9
	[2] => 78
)

使用频率:3~5次


array array_diff($array1, $array2, [, $array ...]) 计算数组的差集

简单地理解为看看后面的数组比前面的数组少了什么就行了

$arr1 = [1, 2, 3 ,4, 'x'];
$arr2 = [2, 3 ,4, 5, 6];
$diffArray = array_diff($arr1, $arr2);
print_r($diffArray);

//结果如下:
Array
(
	[0] => 1
	[4] => x
)

你看看第2个数组的元素里是不是没有1和x的?

使用频率:中小型项目里大概会用1~5次


array array_intersect($array1, $array2) 计算数组的交集

$array1 = [1, 2, 3, 4];
$array2 = [2, 3, 4, 5];
print_r(array_intersect($array2, $array1));

//结果:
Array
(
	[1] => 2
	[2] => 3
	[3] => 4
)

这是两个数组拥有的相同内容,所以称之为交集

使用频率:中小型项目里大概会用1~5次


array array_keys($array1, $array2) 返回数组中部分的或所有的键名

$arr = [
	'a' => 1,
	'b' => 211,
	'c' => 55,
];
$keys = array_keys($arr);
print_r($keys);

//结果:
Array
(
	[0] => a
	[1] => b
	[2] => c
)

需要的时候这个函数挺有用的

而另外它也可以返回指定值部分的健名,比如以下代码就返回了值为211的元素的健名集合:

$arr = [
	'a' => 1,
	'b' => 211,
	'c' => 55,
	'd' => 211,
];
print_r(array_keys($arr, 211));

//结果:
Array
(
	[0] => b
	[1] => d
)

使用频率:中小型项目里大概会用1~3次


list($var1, $var2...) = $array

这个list函数有点特殊,作用是将一个数组的元素分配给给定的变量

$arr = ['老明', 77];

list($name, $age) = $arr;

echo $name; // 老明
echo $age; // 77

使用频率:中小型项目里大概会用0~3次

详细不解说这个函数了,你知道有这种东西就好,平时基本就是不用的,并且不同版本的PHP也可能略有不同,注意版本特性差异


boolean shuffle($array) 打乱数组元素的顺序

$arr = [1, 2, 3, 4, 5];

shuffle($arr);

print_r($arr); // 你看到什么顺序我不知道,反正就不是1 2 3 4 5 6,否则你去买彩票吧

//$arr = shuffle($arr); // 注意不要写成这样,它不返回打乱后的数组,直接将传进去的参数给打乱了

使用频率:中小型项目里大概会用0~3次


extract($array) 根据数组的key名称创建一个相应名称的变量,key的值就是变量的值

$data = [
	'name' => '小明',
	'age' => 18
];
extract($data);
echo $name; // 小明
echo $age; // 18

如果有个key不是字母而是数字,又或是数字开头的字符串,你试试会怎样

使用频率:中小型项目里大概会用0~2次,但模板引擎基本都会用这个


mixed key($array) 返回当前游标所指的元素的键名

前面学习current函数的时候结合next、end和reset函数了解了数组里有个游标的概念,下面的代码相信一下就懂

$arr = [555, 888, 'a' => 999, 444];
echo key($arr); // 0

next($arr);
echo key($arr); // 1

next($arr);
echo key($arr); // a

next($arr);
echo key($arr); // 2

reset($arr);
echo key($arr); // 0

使用频率:中小型项目里大概会用0~2次


array array_merge($array1, $array2, [$array...]) 合并数组

$arr1 = [1, 2, 3];
$arr2 = [4, 5];

print_r(array_merge($arr1, $arr2));

//结果:
Array
(
	[0] => 1
	[1] => 2
	[2] => 3
	[3] => 4
	[4] => 5
)

可以传无限个数组进行合并

使用频率:中小型项目里大概会用3~10次


int array_push($array, $var) 向数组末尾追加一个新的元素

$arr = [1, 8];
array_push($arr, 77);

print_r($arr);

//结果如下:
Array
(
	[0] => 1
	[1] => 8
	[2] => 77
)

我基本是不使用这个函数的,因为直接$arr[] = 77就可以追加元素了,语法的执行效率比函数更快

使用频率:至今我完全能用语法来实现元素的追加,所以还未能找到理由去使用这个函数

使用这个函数的理由:

1. 如果需要在追加元素时第一个参数不是数组就会发生警告,但语法追加不会,反而会产生一个数组

2. 它会返回追加后的总元素个数,如果你需要使用这个个数就用这个函数好过自己重新count

目前我没有这些需求去使用这个函数


接下来我就不详细解释了,要测试请查询PHP手册

bool array_walk($array, $callback) 使用用户自定义函数对数组中的每个元素做回调处理,作用和for循环一样,有人提到这个函数比for循环还高效,我测了一下1亿次for循环反而是这个函数效率慢点,但总体误差可以说是人类感知不到的


mixed array_rand($array, $num = 1) 从数组中随机取出一个或多个单元,个数由第2个参数控制


array_reverse($array, $preserve_keys = false) 将一个数组的元素顺序反转,比如元素是2 6 7的话反过来就是7 6 2咯


mixed array_search($needle, $array) 在数组中搜索给定的值,如果成功则返回相应的键名


mixed array_shift($array) 将数组开头的元素移出数组


array array_slice($array, $offset, $length = null) 裁剪数组,跟substr的使用理念一样,参数也几乎一样


int array_sum($array) 计算数组中所有第一层元素相加的和


array array_unique($array, $sort_flags = SORT_STRING) 去除数组中重复的值


int array_unshift($array, $var) 与array_push相反,将一个元素压入数组的顶部,成为第一个元素


bool array_multisort(array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]]) 对多个数组或多维数组进行排序

这个需求也是常有的,主要是为了对数据库的查询结果列表按照某个字段进行排序,详细请见官方手册的解说


array array_values($array1, $array2) 返回数组中所有的值(不包含key)

$user = [
	'name' => '小明',
	'age' => 18,
];
$values = array_values($user);
print_r($values);

//结果如下:
Array
(
	[0] => 小明1] => 18
)

使用频率:中小项目里一般会用1~3次


bool sort($array, $sortFlag = SORT_REGULAR) 对数组进行排序

$arr = [7, 8, 5, 1, 'xx' => 4];
sort($arr);
print_r($arr);

//结果如下:
Array
(
	[0] => 1
	[1] => 4	//注意,这个4的key不是xx了,排序后不会保留原来的索引
	[2] => 5
	[3] => 7
	[4] => 8
)

其中第二个参数控制了具体的行为,一般极少用到,至少我也未使用过,也未见别人的代码有过

使用频率:中小项目里一般会用1~3次


bool rsort(array &$array, int $sort_flags = SORT_REGULAR) 对数组逆向排序,其实就跟sort的结果相反sort是升序的,这个排序后是降序的

$arr = ['x', 'b', 'h'];
sort($arr);
print_r($arr); //字母升序: b h x

rsort($arr);
print_r($arr); //字母降序: x h b

bool asort(array &$array, int $sort_flags = SORT_REGULAR) 对数组进行排序并保留key

$arr = [7, 8, 5, 1, 'xx' => 4];
asort($arr);
print_r($arr);

//结果如下:
Array
(
	[0] => 1
	[xx] => 4	//保留了索引
	[2] => 5
	[3] => 7
	[4] => 8
)

使用频率:中小项目里一般会用1~2次


bool arsort(array &$array, int $sort_flags = SORT_REGULAR),的rsort函数一样将数组降序列,但会保留key


ksort(array &$array, int $sort_flags = SORT_REGULAR) 按照键名升序排序,并保留key => value的关系

$user = [
	'id' => 1,
	'name' => 'jay',
	'birthday' => '2012-12-12',
	'age' => 18,
];
ksort($user);
print_r($user);

//结果如下,key部分按字母升序排列了:
Array
(
	[age] => 18
	[birthday] => 2012-12-12
	[id] => 1
	[name] => jay
)

使用频率:中小项目里一般会用1~2次


krsort(array &$array, int $sort_flags = SORT_REGULAR) 和上面ksort相反,将key按字母降序排列


以上内容提到的“使用频率”是指业务代码范围的使用频率,不包含框架的使用频率,因为开发一个框架,说实话真是一切PHP的知识都可能会用尽的,那就啥都掌握了