持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
一、键、值操作函数
1、array_values($contact):
不保留键名,按照索引,对数组排列
2、array_keys($contact, '可选参数', '可选参数true/false'):
若设置可选参数,则按照可选参数返回键名,若不设置,直接返回数组的键名,false为不依赖默认参数类型
3、in_array('value', '$contact', '可选参数true/false'):
检查数组中是否存在某值, true类型必须完全一致,搜索值若为字符串,设置true后,则区分大小
4、array_search(value, array, '可选参数true/false'):
array_search()函数与in_array()一样,在数组中查找一个键值。如果找到了该值,则返回匹配该元素所对应的键名。如果没找到,则返回 false。注意在 PHP 4.2.0 之前,函数在失败时返回 null 而不是 false。同样如果第三个参数被指定为true,则只有在数据类型和值都一致时才返回相应元素的键名。
5、array_key_exists(key, array):
判断某个数组array中是否存在指定的key,如果该key存在,则返回true,否则返回false
6、array_flip($contact):
array_flip()返回一个反转后的array。该函数会将数组的键名和元素值互换,如果一个值多次出现,最后一个键名为它的值。
例如 contact中的 值 则变成了 键名。
注意:$contact中的值需要能够作为合法的键名,例如 需要是 integer 或者 string。如果值的类型不对将发出一个警告,并且有问题的键/值对将不会反转。如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。
该函数适用场景举例:可用作去重
7、array_reverse($contact, '可选参数true/false'):
将数组顺序翻转,true保持键名不变。
array_reverse()接受数组 $contact 作为输入 并返回一个单元为相反顺序的新数组,如果 第二个参数为true 则保留原来的键名。如果为false 则键名丢失
8、array_column(input, column_key, index_key):
array_column() 返回input数组中键值为column_key的列,如果指定了可选参数index_key,那么input数组中的 这一列的值 将作为返回数组中对应值的键。
参数:
input:需要取出数组列的多维数组。 如果提供的是包含一组对象的数组,只有 public 属性会被直接取出。 为了也能取出 private 和 protected 属性,类必须实现 get() 和 isset() 魔术方法。
column_key:需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键,也可以是属性名。 也可以是null,此时将返回整个数组(配合index_key参数来重置数组键的时候,非常管用)
index_key:作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。
返回值:
从多维数组中返回单列数组。
9、compact(var1, var2...)
创建一个包含变量名和它们的值的数组。
compact()函数 创建一个由参数所带变量组成的数组。 如果参数中存在数组,该数组中变量的值也会被获取。 本函数返回的数组是一个关联数组,键名为函数的参数,键值为参数中变量的值。 本函数执行的行为与extract() 正好相反
<?php` `//创建一个包含变量名和它们的值的数组:``$firstname` `= ``"Peter"``;``$lastname` `= ``"Griffin"``;``$age` `= ``"41"``;`` ` `$result` `= compact(``"firstname"``, ``"lastname"``, ``"age"``);`` ` `print_r(``$result``);``输出:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 )`` ` ` ` ` ` `//使用没有对应变量名的字符串,以及一个变量名数组:``<?php``$firstname` `= ``"Peter"``;``$lastname` `= ``"Griffin"``;``$age` `= ``"41"``;`` ` `$name` `= ``array``(``"firstname"``, ``"lastname"``);``$result` `= compact(``$name``, ``"location"``, ``"age"``);`` ` `print_r(``$result``);``输出:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 )
二、数组元素个数有关的函数
1、count($contact, '可选参数0/1'):
统计数组的元素个数,可选参数表示是否递归的检测多维数组,0为不检测,1为检测
2、array_count_values($contact):
统计数组元素出现的次数,输出数组,键名为元素值,值为键名出现次数
3、array_unique($contact):
删除数组中的重复元素值,重复的元素,键名保留第一个元素的键名
三、使用回调函数处理数组的函数
1、array_filter(array callback [, int $mode = 0 ]] )
用回调函数过滤数组中的元素
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
参数:
array:要循环遍历的数组
callback:使用的回调函数。如果没有提供 callback 回调函数,将删除 array 数组中的所有“空”元素。 有关 PHP 如何判定“空”元素,请参阅 empty() 。
mode:决定callback接收的参数形式,如下:
①、ARRAY_FILTER_USE_KEY - 将键名作为 callback 回调的唯一参数,而不是值
②、ARRAY_FILTER_USE_BOTH - 将值和键都作为参数传递给 callback 回调,而不是仅传递值
默认值为 0,只传递值作为 callback 回调的唯一参数。
返回值:
返回过滤后的数组。
2、array_map('回调函数',contact1'):
- array_map()函数 将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空。
- 回调函数 接受的参数数量 应该和传递给 array_map() 函数的数组数量一致。
- 您可以向函数输入一个或者多个数组。若向函数输入2个数组,其回调函数参数也应该有两个,map给函数传值时,是每次从两个数组中分别取一个传给函数。即多个数组之间是同步提交的,不是提交完一个数组再提交下一个。
语法:array array_map ( callable callback,arrayarr1 [, array $… ] )
<?php` `//单数组形式``function` `myfunction(``$v``)``{`` ``if``(``$v``===``"Dog"``)`` ``{`` ``return` `"Fido"``;`` ``}` ` ``return` `$v``;``}` `$a` `= ``array``(``"Horse"``,``"Dog"``,``"Cat"``);``print_r(``array_map``(``"myfunction"``, ``$a``));` `//多数组形式``function` `myfunction1(``$v1``,``$v2``)``{`` ``if``(``$v1``===``$v2``)`` ``{`` ``return` `"same"``;`` ``}` ` ``return` `"different"``;``}` `$a1` `= ``array``(``"Horse"``, ``"Dog"``, ``"Cat"``);``$a2` `= ``array``(``"Cow"``, ``"Dog"``, ``"Rat"``);``print_r(``array_map``(``"myfunction1"``, ``$a1``, ``$a2``));
3、array_walk(array|object &callback, mixed $arg = null): bool
使用 用户自定义函数 对数组中的每个 元素 做回调处理。在函数中,数组的键名和键值是参数。
您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值。这样任何对这些元素的改变也将会改变原始数组本身。
提示:如需操作更深的数组(一个数组中包含另一个数组),请使用 array_walk_recursive() 函数。
array_walk()函数 对数组中的每个元素应用回调函数。如果成功则返回 true,否则返回 false。
典型情况下 myfunction 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 arg,将被作为第三个参数传递给回调函数。
如果 myfunction 函数 需要的参数比给出的多,则每次 array_walk() 调用 myfunction 时都会产生一个 E_WARNING 级的错误。这些警告可以通过在 array_walk() 调用前加上 PHP 的错误操作符 @ 来抑制,或者用 error_reporting()。
<?php``$fruits` `= ``array``(``"d"` `=> ``"lemon"``, ``"a"` `=> ``"orange"``, ``"b"` `=> ``"banana"``, ``"c"` `=> ``"apple"``);` `//传引用,改变了所传参数组``function` `test_alter(&``$item1``, ``$key``, ``$prefix``)``{`` ``$item1` `= ``"$prefix: $item1"``;``}` `function` `test_print(``$item2``, ``$key``)``{`` ``echo` `"$key. $item2<br />\n"``;``}` `echo` `"Before ...:\n"``;``//单数组``array_walk``(``$fruits``, ``'test_print'``);` `//带额外参数``array_walk``(``$fruits``, ``'test_alter'``, ``'fruit'``);` `echo` `"... and after:\n"``;` `array_walk``(``$fruits``, ``'test_print'``);
输出结果如下:
Before ...:``d. lemon``a. orange``b. banana``c. apple`` ``... and after:``d. fruit: lemon``a. fruit: orange``b. fruit: banana``c. fruit: apple
4、array_map与array_walk区别:
- map 主要是为了得到你的回调函数处理后的新数组,要的是结果
- walk 主要是对每个参数都使用一次你的回调函数,要的是处理的过程
- walk 可以认为提供额外参数给回调函数,map不可以
- walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组
- map 主要是对数组中的值进行操作后返回数组,以得到一个新数组
- walk 可以没有返回值 map要有,因为要填充数组
四、数组的排序函数
1、sort()和rsort()
数组内部元素从小到大排序
数组内部元素从大到小排序
2、ksort()和krsort()
根据键名对数组排序
按照键名从小到大排序
按照键名从大到小排序
3、asort()和arsort()
按照元素值排序,保留键名
4、natsort()和natcasesort()
根据自然排序法对数组排序,按照数字从1到9,字母从a到z的排序方法,前者忽略键名,后者保留键名,并且前者区分大小写,后者不区分大小写
5、usort()
使用 用户自定义的比较函数 对数组中的值进行排序。
usort排序函数的返回值老是记不住返回1的时候是按升序还是降序排?网上搜了一大堆也没个能说明白的。 直到今天看到了一个说法:
usort函数执行的时候,会依次把$a中的两个值 传递给名字为my_sort函数中,所以你会看到my_sort有两个形参,然后php会判断my_sort函数的返回值:
如果为0,则位置不变
如果为-1,则b不变
如果为1,则b互换
所以我们只需要根据 我们自定义函数 返回的是-1 还是 1 来记,返回1,则表示usort函数会帮我们交换a和b 的位置。返回-1 则不交换 a和b 的位置。
<?php` `/******以下是进行降序排序******/` `$arr` `= [1,6,5,3,4,2];` `//我们这里在 a < b 的时候返回1,表示我们希望a < b 的时候usort函数帮我们交换a,b ,交换后 a和b的大值就会出现在前面。从而达到降序排列数组的目的。``usort(``$arr``, ``function``(``$a``, ``$b``) {`` ``return` `$a` `< ``$b` `? 1 : -1;``});` `print_r(``$arr``);` `//输出如下:``Array``(`` ``[0] => 6`` ``[1] => 5`` ``[2] => 4`` ``[3] => 3`` ``[4] => 2`` ``[5] => 1``)` `/******以下是进行升序排序******/``$arr` `= [1,6,5,3,4,2];` `//a小于b的时候返回-1,说明a < b的时候不需要交换。说明最后是按升序排序。``usort(``$arr``, ``function` `(``$a``, ``$b``) {`` ``return` `$a` `< ``$b` `? -1 : 1;``});` `print_r(``$arr``);` `//输出如下:``Array``(`` ``[0] => 1`` ``[1] => 2`` ``[2] => 3`` ``[3] => 4`` ``[4] => 5`` ``[5] => 6``)
6、uksort()
使用 用户自定义的比较函数 对数组中的键名进行排序。
7、array_multisort()
<?php` `//下面的两个例子对二维数组进行排序` `/******用法一:不需要遍历数组就可以对二维数组排序******/``$data` `= [`` ``[``'a'` `=> 23, ``'b'` `=> ``'hhhh'``, ``'c'` `=> ``'2013-12-23'``],`` ``[``'a'` `=> 26, ``'b'` `=> ``'hkkk'``, ``'c'` `=> ``'2013-12-26'``],`` ``[``'a'` `=> 20, ``'b'` `=> ``'565'``, ``'c'` `=> ``'2013-12-28'``],`` ``[``'a'` `=> 29, ``'b'` `=> ``'fhj'``, ``'c'` `=>``' 2013-11-23'``],`` ``[``'a'` `=> 10, ``'b'` `=> ``'fffff'``, ``'c'` `=> ``'2013-12-24'``],``];` `// 取'a'列数据进行升序排列``array_multisort``(array_column(``$data``, ``'a'``),SORT_ASC, ``$data``);` `print_r(``$data``);` `//输出结果如下:``Array``(`` ``[0] => Array`` ``(`` ``[a] => 10`` ``[b] => fffff`` ``[c] => 2013-12-24`` ``)` ` ``[1] => Array`` ``(`` ``[a] => 20`` ``[b] => 565`` ``[c] => 2013-12-28`` ``)` ` ``[2] => Array`` ``(`` ``[a] => 23`` ``[b] => hhhh`` ``[c] => 2013-12-23`` ``)` ` ``[3] => Array`` ``(`` ``[a] => 26`` ``[b] => hkkk`` ``[c] => 2013-12-26`` ``)` ` ``[4] => Array`` ``(`` ``[a] => 29`` ``[b] => fhj`` ``[c] => 2013-11-23`` ``)``)` ` ` ` ` `/******用法二:通常用法******/``$data` `= [`` ``[``'volume'` `=> 67, ``'edition'` `=> 2],`` ``[``'volume'` `=> 86, ``'edition'` `=> 1],`` ``[``'volume'` `=> 85, ``'edition'` `=> 6],`` ``[``'volume'` `=> 98, ``'edition'` `=> 2],`` ``[``'volume'` `=> 86, ``'edition'` `=> 6],`` ``[``'volume'` `=> 67, ``'edition'` `=> 7],``];` `$volume` `= [];``$edition` `= [];` `foreach``(``$data` `as` `$key` `=> ``$row``)``{`` ``$volume``[``$key``] = ``$row``[``'volume'``];`` ``$edition``[``$key``] = ``$row``[``'edition'``];``}` `array_multisort``(``$volume``,SORT_DESC, ``$edition``,SORT_ASC, ``$data``);` `print_r(``$data``);` `//输出结果如下:``Array``(`` ``[0] => Array`` ``(`` ``[volume] => 98`` ``[edition] => 2`` ``)` ` ``[1] => Array`` ``(`` ``[volume] => 86`` ``[edition] => 1`` ``)` ` ``[2] => Array`` ``(`` ``[volume] => 86`` ``[edition] => 6`` ``)` ` ``[3] => Array`` ``(`` ``[volume] => 85`` ``[edition] => 6`` ``)` ` ``[4] => Array`` ``(`` ``[volume] => 67`` ``[edition] => 2`` ``)` ` ``[5] => Array`` ``(`` ``[volume] => 67`` ``[edition] => 7`` ``)``)
8、shuffle($arr)
函数把数组中的元素按随机顺序重新排列。若成功,则返回 true,否则返回 false。
注释:本函数为数组中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。
<?php` `$my_array` `= ``array``(``"a"` `=> ``"Dog"``, ``"b"` `=> ``"Cat"``, ``"c"` `=> ``"Horse"``);` `shuffle(``$my_array``); print_r(``$my_array``);` `输出:``Array ( [0] => Cat [1] => Horse [2] => Dog )
9、array_rand(number)
array_rand()函数 从数组中随机选出一个或多个元素,并返回。
第二个参数用来确定要选出几个元素。如果选出的元素只有一个,返回该元素的键名(注意是键名不是键值)。
注释:如果指定array_rand()函数选取的元素个数大于1,那么不管抽取的是数字索引数组还是关联数组,都将取得原数组的key(注意是key),并放在一个新的索引数组中。
$a` `= ``array``(``"a"` `=> ``"Dog"``, ``"b"` `=> ``"Cat"``, ``"c"` `=> ``"Horse"``);``print_r(``array_rand``(``$a``,1));` `输出:``b`` ` ` ` `$a``=``array``(``"a"` `=> ``"Dog"``, ``"b"` `=> ``"Cat"``, ``"c"` `=> ``"Horse"``);``print_r(``array_rand``(``$a``,2));`` ` `输出:``Array ( [0] => c [1] => b )
五、拆分,合并,分解,结合数组
1、array_slice($contact, '取出元素的初始值', '可选择参数:取出元素的长度', '可选择参数:true/false'):
取出元素的初始值若为正值,则从前往往后取,负数则从前向后取,最后一个元素为-1,则从负数值开始往后取。true将保留键名
2、array_splice($contact, '删除元素的初始值', '删除元素的长度', '可选参数:替换数组'):
初始值如果是正数,则从此值开始删除,负数跟slice()同理,如设置替换数组,则将替换数组插入删除的位置。
3、array_combine(contact2):
创建一个数组,用第一个数组元素的值作为其键名,第二个数组元素的值作为其值
4、array_merge(contact2, [,...]):
第一个参数为必选参数,仅有一个会以索引数组的形式输出。多个数组合并,键名重复,后面的会覆盖前面的。
然后再说一下 数组的 + 加号运算符 和 array_merge的区别在于:遇到相等key时,用+时,左边数组会覆盖掉右边数组的值,array_merge相反,后面的数组覆盖掉前面的
5、array_intersect(contact2, [,...]):
数组的交集,键名不变,仅数组值进行比较,输出第一个数组中 二者共同有的
<?php` `$a1` `= ``array``(``"a"` `=> ``"red"``, ``"b"` `=> ``"green"``, ``"c"` `=> ``"blue"``, ``"d"` `=> ``"yellow"``);``$a2` `= ``array``(``"e"` `=> ``"red"``, ``"f"` `=> ``"green"``, ``"g"` `=> ``"blue"``);` `$result``=``array_intersect``(``$a1``, ``$a2``);` `print_r(``$result``);``#输出:Array ( [a] => red [b] => green [c] => blue )` `$a1` `= ``array``(``"a"` `=> ``"red"` `, ``"b"` `=> ``"green"``, ``"c"` `=> ``"blue"``, ``"d"` `=> ``"yellow"``);``$a2` `= ``array``(``"e"` `=> ``"red"` `, ``"f"` `=> ``"black"``, ``"g"` `=> ``"purple"``);``$a3` `= ``array``(``"a"` `=> ``"red"` `, ``"b"` `=> ``"black"``, ``"h"` `=> ``"yellow"``);` `$result``=``array_intersect``(``$a1``, ``$a2``, ``$a3``);` `print_r(``$result``);``#输出:Array ( [a] => red )
6、array_diff(contact2, $contact3):
数组的差集,第一个数组和第二个参数为必选的参数,第三个参数乃至于以后可选,输出第一个数组中有,其他数组没有的值
<?php``$a1` `= ``array``(``"a"` `=> ``"red"``, ``"b"` `=> ``"green"``, ``"c"` `=> ``"blue"``, ``"d"` `=> ``"yellow"``);``$a2` `= ``array``(``"e"` `=> ``"red"``, ``"f"` `=> ``"green"``, ``"g"` `=> ``"blue"``);` `$result` `= ``array_diff``(``$a1``, ``$a2``);` `print_r(``$result``);``# 输出:Array ( [d] => yellow )` `$a1` `= ``array``(``"a"` `=> ``"red"``, ``"b"` `=> ``"green"``, ``"c"` `=> ``"blue"``, ``"d"` `=> ``"yellow"``);``$a2` `= ``array``(``"e"` `=> ``"red"``, ``"f"` `=> ``"black"``, ``"g"` `=> ``"purple"``);``$a3` `= ``array``(``"a"` `=> ``"red"``, ``"b"` `=> ``"black"``, ``"h"` `=> ``"yellow"``);` `$result` `= ``array_diff``(``$a1``, ``$a2``, ``$a3``);` `print_r(``$result``);``# 输出:Array ( [b] => green [c] => blue )
六、获取数组中第一个元素或最后一个元素
1、第一种情况(从数组中取出,则数组不在存在)
arr);
arr);
2、第二种情况(从数组中取出,数组中还存在)
arr); 或 arr);
arr) ; 或 arr, -1, 1);