PHP数组相关的函数是允许你通过不同的方式来使用和操作数组。数组是存储、管理和操作变量组的必不可少的工具。
下面对PHP数组函数进行梳理:
1.foreach 语句,这不是个函数,而是个语言结构,用来遍历数组最简单的方式。这个内容已经在流程控制做了介绍。
2.使用 list、each 和 while 遍历数组。
其中 list 不是函数,是个语言结构。list() 用一步操作给一组变量进行赋值,仅能用于数字索引的数组并假定数字索引从 0 开始。
each()函数是返回数组中当前的键/值对并将数组指针向前移动一步。键值对被返回为四个单元的数组,键名为0,1,key和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。
<?php $arr = array( "key1" => "value1", "key2" => "value2", "key3" => "value3" ); var_dump(each($arr)); //each函数返回四组值 reset($arr); //将数组指针重新回到最开始的位置 echo '<br>'; //下面使用each list while遍历数组 while(list($key,$value) = each($arr)){ echo "$key => $value"; echo '<br>'; } ?>
3.数组指针控制函数:next()、prev()、end() 和 reset()
next($array) 将数组中的内部指针向前移动一位
prev($array) 将数组的内部指针倒回一位
end($array) 将数组的内部指针指向最后一个单元
reset($array) 将数组的内部指针指向第一个单元
<?php $arr = array( "key1" => "value1", "key2" => "value2", "key3" => "value3", "key4" => "value4" ); var_dump(next($arr)); //向前移动一位,输出结果为 "value2" var_dump(prev($arr)); //向后移动一位,输出结果为 "value1" var_dump(end($arr)); //移动到最后一位,输出结果为 "value4" var_dump(reset($arr)); //移动到最开始的位置,输出结果为 "value1" ?>
4.数组的键/值操作函数:array_values()、array_keys()、in_array()、array_flip() 和 array_reverse()
array_values() 返回数组中所有的值
array_keys() 返回数组中所有的键
in_array() 检查数组中是否存在某个值
array_flip() 交换数组中的键和值
array_reverse() 返回一个单元顺序相反的数组
4.1 array_values($array) 返回数组中所有的值,并给其建立数字索引。
<?php $arr = array( "key1" => "value1", "key2" => "value2", "key3" => "value3", "key4" => "value4" ); print_r(array_values($arr)); //输出结果为Array ( [0] => value1 [1] => value2 [2] => value3 [3] => value4 ) ?>
4.2 array_keys($array [, mixed $search_value [, bool $strict = false]]) 返回数组中所有的键,有两个可选参数:指定$search_value 则返回该值的键名,$strict 判断在搜索的时候是否该使用严格的比较(===)。
<?php $arr = array( "a" => 5, "b" => 10, "c" => "value3", "d" => "value4" ); print_r(array_keys($arr)); //输出结果为Array ( [0] => a [1] => b [2] => c [3] => d ) echo '<br>'; print_r(array_keys($arr, 5)); //输出结果为Array ( [0] => a ) echo '<br>'; print_r(array_keys($arr, "5", TRUE)); //找不到,输出结果为空array ?>
4.3 in_array($needle, $array [, bool $strict = false]) 在$array 数组中查询 $needle ,返回布尔值。可选参数$strict 设置搜索是否使用严格比较(===)。
<?php $arr = array( "a" => 5, "b" => 10, "c" => "value3", "d" => "value4" ); var_dump(in_array(5, $arr)); //输出结果为真 TURE ?>
4.4 array_flip($array) 返回一个反转后的array。数组中的键名变成值,值变成键名。
注意 $array 中的值需要能够作为合法的键名,例如需要是 integer 或者 string。如果值的类型不对将发出一个警告,并且有问题的键/值对将不会反转。如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。
4.5 array_reverse($array [, bool $preverse_key = false]) 接受数组 $array 作为输入并返回一个单元为相反顺序的新数组。
可选参数$preverse_key如果设置为 TRUE 会保留数字的键。 非数字的键则不受这个设置的影响,总是会被保留。
<?php $arr = array("php", 4, array("green", "red")); print_r(array_reverse($arr)); //输出结果为 Array ( [0] => Array ( [0] => green [1] => red ) [1] => 4 [2] => php ) echo '<br>'; print_r(array_reverse($arr, TRUE));//输出结果为 Array ( [2] => Array ( [0] => green [1] => red ) [1] => 4 [0] => php ) ?>
5.统计数组中的元素个数和唯一性:count() array_count_values() array_unique()
5.1 count($array [, $mod = COUNT_NORMAL]) 计算数组中的单元数目或对象中的属性个数。
如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。mode 的默认值是 0。count() 识别不了无限递归。
<?php $arr = array(2, "php", "xiaofan", array(5, 8, array(2, 5))); echo count($arr); //输出结果为 4 echo '<br>'; echo count(false); //输出结果为 1 不是数组类型的就会返回1 echo '<br>'; echo count(NULL); //输出结果为 0 这是个特例 echo '<br>'; echo count($arr, 1); //输出结果为 9,这里会显示递归 ?>
5.2 array_count_values($array) 统计数组中所有的值出现的次数。
返回一个数组,该数组用 $array 数组中的值作为键名,该值在 $array 数组中出现的次数作为值。
5.3 array_unique($array [, $sort_flags = SORT_STRING]) 移除数组中重复的值。注意键名保留不变。
可选参数 $sort_flags 有四个可选值
- SORT_STRING - 默认。把项目作为字符串来比较。
- SORT_REGULAR - 把每一项按常规顺序排列(Standard ASCII,不改变类型)。
- SORT_NUMERIC - 把每一项作为数字来处理。
- SORT_LOCALE_STRING - 把每一项作为字符串来处理,基于当前区域设置(可通过 setlocale() 进行更改)。
<?php $arr = array(2, "2", 5, 7, "7"); var_dump(array_unique($arr)); //输出结果 array(3) { [0]=> int(2) [2]=> int(5) [3]=> int(7) } ?>
6.使用回调函数处理数组的函数:array_filter() array_walk() array_map()
6.1 array_filter($arr, [, $callable [, $flag = 0]]) 用回调函数过滤数组中的单元。
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
可选参数$flag 决定callback接收的参数形式
- ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数
- ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值
<?php function fun($var){ if($var % 2 == 0){ return TRUE; } } $arr = array(2, 5, 6, 9, 10); print_r(array_filter($arr, "fun")); //返回结果为Array ( [0] => 2 [2] => 6 [4] => 10 ) ?>
6.2 array_walk($array, $callable [, $userdata = NULL]) 使用用户自定义函数对数组中的每个元素做回调处理。
典型情况下 $callable 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 $userdata,将被作为第三个参数传递给 $callable。
成功时返回 TRUE, 或者在失败时返回 FALSE。
<?php function fun(&$item, $key, $prefix){ //使用地址符 & 回调函数在执行时,同时改变了$arr数组中的原值 $item = "$prefix: $item"; } $arr = array("a" => "orange", "b" => "banana", "c" => "apple"); array_walk($arr, "fun", 'fruit'); print_r($arr); //输出结果为 Array ( [a] => fruit: orange [b] => fruit: banana [c] => fruit: apple ) ?>
6.3 array_map($callable, $arr1 [, $arr2 ...]) 将回调函数作用到给定数组的单元上。
array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
<?php function English($n, $m){ return "The number $n is called $m in english"; } $arr1 = array(1, 2, 3, 4); $arr2 = array("one", "two", "three", "four"); var_dump(array_map("English",$arr1, $arr2)); //输入结果 array(4) { [0]=> string(37) "The number 1 is called one in english" [1]=> string(37) "The number 2 is called two in english" [2]=> string(39) "The number 3 is called three in english" [3]=> string(38) "The number 4 is called four in english" } ?>
本函数一个有趣的用法是构造一个数组的数组,这可以很容易的通过用 NULL 作为回调函数名来实现。
<?php $arr1 = array(1, 2, 3, 4); $arr2 = array("one", "two", "three", "four"); $arr3 = array("yi", "er", "san", "si"); print_r(array_map(null,$arr1, $arr2, $arr3)); //输入结果 Array ( [0] => Array ( [0] => 1 [1] => one [2] => yi ) [1] => Array ( [0] => 2 [1] => two [2] => er ) [2] => Array ( [0] => 3 [1] => three [2] => san ) [3] => Array ( [0] => 4 [1] => four [2] => si ) ) ?>
7.数组的排序函数
以上数组排序函数返回值为布尔值,传参为数组,或者数组和函数
sort() 对数组进行排序(升序)
rsort() 对数组进行逆向排序(降序)
usort() 使用用户自定义的比较函数对数组中的值进行排序
asort() 对数组进行排序并保持索引关系(关联数组排序)
arsort() 对数组进行逆向排序并保持索引关系
uasort() 使用用户自定义比较函数对数组进行排序并保持索引关系
ksort() 对数组按照键名进行排序
krsort() 对数组按照键名逆向排序
uksort() 使用用户自定义比较函数对数组中的键名进行排序
natsort() 用“自然排序”算法对数组排序
natcasesort() 用“自然排序”算法对数组排序,并且不区分大小写字母
注意:自然排序指的是实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键/值的关联。以下是natsort()与sort()的区别示例
<?php $arr = array("a" => "img1.jpg", "b" => "img5.jpg", "c" => "img2.jpg", "d" => "img10.jpg"); asort($arr); print_r($arr); //输出结果为 Array ( [a] => img1.jpg [d] => img10.jpg [c] => img2.jpg [b] => img5.jpg ) natsort($arr); print_r($arr); //输出结果为 Array ( [a] => img1.jpg [c] => img2.jpg [b] => img5.jpg [d] => img10.jpg ) ?>
8. 拆分、合并、分解与结合数组
array_slice -- 从数组中取出一段
array_splice -- 把数组中的一部分去掉并用其它值取代
array_combine -- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_merge -- 合并一个或多个数组
array_intersect -- 计算数组的交集
array_diff -- 计算数组的差集
9. 数组与数据结构
array_pop -- 将数组最后一个单元弹出(出栈)
array_push -- 将一个或多个单元压入数组的末尾(入栈)
array_shift -- 将数组开头的单元移出数组
array_unshift -- 在数组开头插入一个或多个单元
10. 其它有用的数组函数
array_rand -- 从数组中随机取出一个或多个单元
shuffle -- 将数组打乱