【整理】php数组的相关处理函数

252 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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中的 键名 变成了 值,而 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 array[,callablearray [, callable 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('回调函数',contact,之后可选参数数组contact, '之后可选参数数组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 &array,callablearray, callable 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,则a位置和a位置和b不变

如果为1,则a位置和a位置和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(array,array, 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(contact1,contact1, contact2):

创建一个数组,用第一个数组元素的值作为其键名,第二个数组元素的值作为其值

4、array_merge(contact1,contact1, contact2, [,...]):

第一个参数为必选参数,仅有一个会以索引数组的形式输出。多个数组合并,键名重复,后面的会覆盖前面的。

然后再说一下 数组的 + 加号运算符 和 array_merge的区别在于:遇到相等key时,用+时,左边数组会覆盖掉右边数组的值,array_merge相反,后面的数组覆盖掉前面的

5、array_intersect(contact1,contact1, 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(contact1,contact1, 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、第一种情况(从数组中取出,则数组不在存在)

first=arrayshift(first = array_shift(arr);

last=arraypop(last = array_pop(arr);

2、第二种情况(从数组中取出,数组中还存在)

first=current(first = current(arr); 或 first=reset(first = reset(arr);

last=end(last = end(arr) ; 或 last=arrayslice(last = array_slice(arr, -1, 1);