PHP常用数组函数
PHP常用数组函数
PHP中有一些常用的数组函数,最好能记忆下来。能帮助我们事半功倍,让代码更加简洁。
1、array_diff( )
1)array_diff(array1,array2,array3...) 其中array3为可选参数。该函数用于比较两个(或更多个)数组的键值,并返回差集。
2)该函数比较两个(或更多个)数组的键值,并返回一个差集数组,该数组包括了所有在被比较的数组(array1)中,但是不在任何其他参数数组(array2 或 array3 等等)中的键值。
1 <?php 2 3 $a1=["a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"]; 4 $a2=["e"=>"red","f"=>"green","g"=>"blue"]; 5 6 // 比较数组,返回差集(只比较键值) 7 $result=array_diff($a1,$a2); 8 print_r($result); 9 10 // 结果 11 Array 12 ( 13 [d] => yellow 14 )
2、array_diff_assoc( )
用于比较两个(或更多个)数组的键名和键值 ,并返回差集
1 <?php 2 3 $a1=["a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"]; 4 $a2=["a"=>"red","f"=>"green","g"=>"blue"]; 5 6 // 比较数组,返回差集(比较键名和键值) 7 $result=array_diff_assoc($a1,$a2); 8 print_r($result); 9 10 // 结果 11 Array 12 ( 13 [b] => green 14 [c] => blue 15 [d] => yellow 16 )
3、array_intersect( )
比较数组,返回交集(只比较键值)
1 <?php 2 3 $a1=["a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"]; 4 $a2=["e"=>"red","f"=>"green","g"=>"blue"]; 5 6 // 比较数组,返回交集(只比较键值) 7 $result=array_intersect($a1,$a2); 8 print_r($result); 9 10 // 结果 11 Array 12 ( 13 [a] => red 14 [b] => green 15 [c] => blue 16 )
4、array_intersect_assoc( )
比较数组,返回交集(比较键名和键值)数组
1 <?php 2 3 $a1=["a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"]; 4 $a2=["a"=>"red","b"=>"green","g"=>"blue"]; 5 6 // 比较数组,返回交集(比较键名和键值) 7 $result=array_intersect_assoc($a1,$a2); 8 print_r($result); 9 10 // 结果 11 Array 12 ( 13 [a] => red 14 [b] => green 15 )
5、array_filter( )
用回调函数过滤数组中的元素 ,该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。
1 <?php 2 3 error_reporting(E_ALL & ~(E_NOTICE) & ~(E_WARNING)); 4 5 function test_odd($var) 6 { 7 return ($var & 1); 8 } 9 10 $a1 = array("a", "b", 2, 3, 4); 11 // 回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。 12 print_r(array_filter($a1, "test_odd")); 13 14 // 返回结果 15 Array 16 ( 17 [3] => 3 18 )
注意:此处的&是位运算符:按位与,运算前先转换为8位的二进制,全1为1,否则为0
这里比较有意思的是,我们按照a的ascii码也就是97,转成二进制1100001,按理说与1做按位与"&"运算后,返回的是true,然而结果并没有。原因是什么呢?
我们看下php官网中对于位运算中变量类型的转换是怎么讲的:
上面的英文很重要,翻译出来的意思是:
如果&, |,^的两个操作数都是字符串, 那会先把字符串转换成对应的ascii码然后再进行位操作, 如果是其它情况,那就把它们都转换成整型再进行位操作。
因此,不管是"a"还是"b",同 1 做"&"运算时,都是先转换成整型 0 ,再进行位操作,结果都是 0。
6、array_key_exists( )
检查指定的键名是否存在于数组中
1 <?php 2 3 $a = array("a" => "Dog", "b" => "Cat"); 4 if (array_key_exists("c", $a)) { 5 echo "Key exists!"; 6 } else { 7 echo "Key does not exist!"; 8 } 9 10 // 返回结果 11 Key does not exist!
7、array_keys( )
返回数组中所有的键名
1 <?php 2 3 $a = array("a" => "Dog", "b" => "Cat"); 4 print_r(array_keys($a)); 5 6 // 返回结果 7 Array 8 ( 9 [0] => a 10 [1] => b 11 )
8、array_values( )
返回数组中所有的键值
1 <?php 2 3 $a = array("a" => "Dog", "b" => "Cat"); 4 print_r(array_values($a)); 5 6 // 返回结果 7 Array 8 ( 9 [0] => Dog 10 [1] => Cat 11 )
9、array_column( )
返回输入数组中某个单一列的值 , array_column ( array $input , mixed $column_key , mixed $index_key = null ) : array
其中,$column_key: 需要返回值的列 $index_key: 作为返回数组的索引/键的列
1 <?php 2 3 $a = [ 4 ['id' => 1, 'first_name' => 'Bill', 'last_name' => 'Gates'], 5 ['id' => 2, 'first_name' => 'Steve', 'last_name' => 'Jobs'], 6 ['id' => 3, 'first_name' => 'Mark', 'last_name' => 'Zuckerberg'], 7 ]; 8 print_r(array_column($a,'first_name')); 9 10 // 返回结果 11 Array 12 ( 13 [0] => Bill 14 [1] => Steve 15 [2] => Mark 16 )
10、array_map( )
将用户自定义函数作用到数组中的每个值上
1 <?php 2 3 function myFunction($num) 4 { 5 return ($num * $num); 6 } 7 8 $a = array(1, 2, 3, 4, 5); 9 print_r(array_map("myFunction", $a)); 10 11 // 返回结果 12 Array 13 ( 14 [0] => 1 15 [1] => 4 16 [2] => 9 17 [3] => 16 18 [4] => 25 19 )
11、array_merge( )
把一个或多个数组合并为一个数组
说明:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
1 <?php 2 3 $array1 = array("color" => "red", 2, 4); 4 $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); 5 $result = array_merge($array1, $array2); 6 print_r($result); 7 8 // 返回结果 9 Array 10 ( 11 [color] => green 12 [0] => 2 13 [1] => 4 14 [2] => a 15 [3] => b 16 [shape] => trapezoid 17 [4] => 4 18 )
12、array_multisort(array1,array1_sort_order )
1)对多个数组或多维数组进行排序
2)SORT_ASC 按照上升顺序排序, SORT_DESC 按照下降顺序排序。默认是 SORT_ASC
1 <?php 2 3 $arr1 = array(10, 100, 100, 0); 4 array_multisort($arr1); 5 print_r($arr1); 6 7 // 返回结果 8 Array 9 ( 10 [0] => 0 11 [1] => 10 12 [2] => 100 13 [3] => 100 14 )
多维数组排序 如下:
1 <?php 2 3 $data[] = array('volume' => 67, 'edition' => 2); 4 $data[] = array('volume' => 86, 'edition' => 1); 5 $data[] = array('volume' => 85, 'edition' => 6); 6 $data[] = array('volume' => 98, 'edition' => 2); 7 $data[] = array('volume' => 86, 'edition' => 6); 8 $data[] = array('volume' => 67, 'edition' => 7); 9 10 $volume = array_column($data, 'volume'); 11 $edition = array_column($data, 'edition'); 12 // 把 $data 作为最后一个参数,以通用键排序 13 array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); 14 print_r($data); 15 // 返回结果 16 Array 17 ( 18 [0] => Array 19 ( 20 [volume] => 98 21 [edition] => 2 22 ) 23 24 [1] => Array 25 ( 26 [volume] => 86 27 [edition] => 1 28 ) 29 30 [2] => Array 31 ( 32 [volume] => 86 33 [edition] => 6 34 ) 35 36 [3] => Array 37 ( 38 [volume] => 85 39 [edition] => 6 40 ) 41 42 [4] => Array 43 ( 44 [volume] => 67 45 [edition] => 2 46 ) 47 48 [5] => Array 49 ( 50 [volume] => 67 51 [edition] => 7 52 ) 53 54 )
13、array_pop( )
删除数组的最后一个元素(出栈)
说明:返回被删除的那个元素,若数组为空或者非数组,将返回NULL
1 <?php 2 3 $a = array("red", "green", "blue"); 4 // 返回数组的最后一个值 5 print_r(array_pop($a)); 6 echo PHP_EOL; 7 print_r($a); 8 // 返回结果 9 blue 10 array 11 ( 12 [0] => red 13 [1] => green 14 )
14、array_push( )
将一个或多个元素插入数组的末尾(入栈)
说明:返回新数组的元素个数 string
1 <?php 2 3 $a = array("red", "green"); 4 $res = array_push($a, "blue", "yellow"); 5 print_r($res); 6 echo PHP_EOL; 7 print_r($a); 8 // 返回结果 9 4 10 Array 11 ( 12 [0] => red 13 [1] => green 14 [2] => blue 15 [3] => yellow 16 )
15、array_replace( )
使用后面的数组中元素替换第一个数组中的元素
说明:返回被替换的数组,如果发生错误则返回 NULL
1 <?php 2 3 $a1=array("red","green"); 4 $a2=array("blue","yellow"); 5 print_r(array_replace($a1,$a2)); 6 // 返回结果 7 Array 8 ( 9 [0] => blue 10 [1] => yellow 11 )
16、array_shift( )
删除数组中首个元素
说明: 返回被删除元素的值 string
1 <?php 2 3 $a=array("a"=>"red","b"=>"green","c"=>"blue"); 4 echo array_shift($a); 5 echo PHP_EOL; 6 print_r ($a); 7 // 返回结果 8 red 9 Array 10 ( 11 [b] => green 12 [c] => blue 13 )
17、array_slice( )
1)返回数组中被选定的部分
2)返回数组中的选定部分 array_slice(array,start,length,preserve)
1 <?php 2 3 $a=array("red","green","blue","yellow","brown"); 4 print_r(array_slice($a,2)); 5 // 返回结果: 从数组的第三个元素(索引为 2)开始取出,并返回直到数组末端的所有元素 6 Array 7 ( 8 [0] => blue 9 [1] => yellow 10 [2] => brown 11 )
18、array_splice( )
从数组中移除选定的元素,并用新元素取代它
说明:array_splice(array,start,length,array) 返回被提取元素组成的数组
注意:不保留被替换数组中的键名
1 <?php 2 3 $a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow"); 4 $a2 = array("a" => "purple", "b" => "orange"); 5 $res = array_splice($a1, 0, 2, $a2); 6 print_r($res); 7 echo PHP_EOL; 8 print_r($a1); 9 // 返回结果 10 Array 11 ( 12 [a] => red 13 [b] => green 14 ) 15 16 Array 17 ( 18 [0] => purple 19 [1] => orange 20 [c] => blue 21 [d] => yellow 22 )
提示:如果函数没有移除任何元素(length=0),则将从 start 参数的位置插入被替换数组
1 <?php 2 3 $a1 = array("0" => "red", "1" => "green"); 4 $a2 = array("0" => "purple", "1" => "orange"); 5 $res = array_splice($a1, 1, 0, $a2); 6 print_r($res); 7 echo PHP_EOL; 8 print_r($a1); 9 // 返回结果 10 Array 11 ( 12 ) 13 14 Array 15 ( 16 [0] => red 17 [1] => purple 18 [2] => orange 19 [3] => green 20 )
19、array_unshift( )
向数组开头插入一个或多个元素
说明:返回数组中元素的个数
1 <?php 2 3 $a = array("a" => "red", "b" => "green"); 4 $res = array_unshift($a, "blue"); 5 print_r($res); 6 echo PHP_EOL; 7 print_r($a); 8 // 返回结果 9 3 10 Array 11 ( 12 [0] => blue 13 [a] => red 14 [b] => green 15 )
20、array_chunk(array,size,preserve_keys )
把一个数组分割为新的数组块
其中,size: 一个整数,规定每个新数组块包含多少个元素 preserve_key:可选,true - 保留原始数组中的键名。false - 默认。每个新数组块使用从零开始的索引。
例一:
1 <?php 2 3 $cars = array("Volvo", "BMW", "Toyota", "Honda", "Mercedes", "Opel"); 4 print_r(array_chunk($cars, 2)); 5 // 返回结果 6 Array 7 ( 8 [0] => Array 9 ( 10 [0] => Volvo 11 [1] => BMW 12 ) 13 14 [1] => Array 15 ( 16 [0] => Toyota 17 [1] => Honda 18 ) 19 20 [2] => Array 21 ( 22 [0] => Mercedes 23 [1] => Opel 24 ) 25 26 )
例二:
1 <?php 2 3 $cars = array("Volvo", "BMW", "Toyota", "Honda", "Mercedes", "Opel"); 4 print_r(array_chunk($cars, 2,true)); 5 6 7 // 运行结果 8 Array 9 ( 10 [0] => Array 11 ( 12 [0] => Volvo 13 [1] => BMW 14 ) 15 [1] => Array 16 ( 17 [2] => Toyota 18 [3] => Honda 19 ) 20 [2] => Array 21 ( 22 [4] => Mercedes 23 [5] => Opel 24 ) 25 )
21、array_walk( array,myfunction,parameter...)
1)对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数
2)可选。规定用户自定义函数的参数,您可以为函数设置一个或多个参数。比如:array_walk($a,"myfunction","has the value")
说明:如果成功则返回 TRUE,否则返回 FALSE
1 <?php 2 3 function myfunction($value, $key) 4 { 5 echo "The key $key has the value $value" . PHP_EOL; 6 } 7 8 $a = array("a" => "red", "b" => "green", "c" => "blue"); 9 array_walk($a, "myfunction"); 10 // 返回结果 11 The key a has the value red 12 The key b has the value green 13 The key c has the value blue
改变数组元素的值(请注意 &$value):
1 <?php 2 3 function myfunction(&$value, $key) 4 { 5 $value = "yellow"; 6 } 7 8 $a = array("a" => "red", "b" => "green", "c" => "blue"); 9 $res = array_walk($a, "myfunction"); 10 print_r($res); 11 echo PHP_EOL; 12 print_r($a); 13 // 返回结果 14 1 15 Array 16 ( 17 [a] => yellow 18 [b] => yellow 19 [c] => yellow 20 )
22、array_combine( )
说明:通过合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组元素为键值
1 <?php 2 3 $fname = array("Peter", "Ben", "Joe"); 4 $age = array("35", "37", "43"); 5 6 $c = array_combine($fname, $age); 7 print_r($c); 8 // 返回结果 9 Array 10 ( 11 [Peter] => 35 12 [Ben] => 37 13 [Joe] => 43 14 )
23、array_flip
反转数组中的键名和对应关联的键值
1 <?php 2 3 $a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow"); 4 $result = array_flip($a1); 5 print_r($result); 6 7 // 返回结果 8 Array 9 ( 10 [red] => a 11 [green] => b 12 [blue] => c 13 [yellow] => d 14 )
PHP数组去重
一般情况下,我们会考虑使用array_unique( )来实现,大多数情况情况下都是没问题的。但是,在一个大的数组里使用array_unique( )函数,它的运行效率就比较慢。
我们可以用array_flip()来替代使用array_unique()来创建唯一的数组。array_flip()会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,得到的结果跟array_unique()一样。
1 <?php 2 3 $array = array('green', 'blue', 'orange', 'blue'); 4 $array = array_flip($array); 5 print_r($array); 6 // 返回结果 7 Array 8 ( 9 [green] => 0 10 [blue] => 3 11 [orange] => 2 12 )
因为我们已经移除了一些元素,因此数组看起来不是正常的序列。还需要处理一下,才能得到我们想要的结果。
解决办法:
方式一:使用array_merge()修复数组的keys
1 <?php 2 3 $array = array('green', 'blue', 'orange', 'blue'); 4 $array = array_flip($array); 5 6 $array = array_flip($array); 7 8 $array = array_merge($array); 9 10 print_r($array); 11 // 返回结果 12 Array 13 ( 14 [0] => green 15 [1] => blue 16 [2] => orange 17 )
方式二:使用array_keys( )
1 <?php 2 3 $array = array('green', 'blue', 'orange', 'blue'); 4 $array = array_flip($array); 5 $array = array_keys($array); 6 print_r($array); 7 // 返回结果 8 array 9 ( 10 [0] => green 11 [1] => blue 12 [2] => orange 13 )
比较推荐第二种方式,显然它要更简洁一些。
24、array_search(value,array,strict)
在数组中搜索某个键值,并返回对应的键名。
如果第三个参数 strict ,默认为false,如果被指定为 true,则只有在数据类型和值都一致时才返回相应元素的键名
说明:自 PHP 4.2.0 起,如果搜索失败,该函数返回 FALSE
例一:
1 <?php 2 $a=array("a"=>"red","b"=>"green","c"=>"blue"); 3 echo array_search("red",$a); 4 5 // 输出结果 6 // a
例二:
1 <?php 2 $a=array("a"=>"5","b"=>5,"c"=>"5"); 3 echo array_search(5,$a,true); 4 5 // 输出结果 6 // b
25、array_count_values()
函数用于统计数组中所有值出现的次数
例一:
1 <?php 2 $array = array('green', 'blue', 'orange', 'blue', 'green', 'blue'); 3 print_r($array); 4 // 返回结果 5 array 6 ( 7 [green] => 2 8 [blue] => 3 9 [orange] => 1 10 ) 11 12 13 // 相关应用代码:过滤出现次数大于2的元素 14 $idsMap = array_count_values($idsArr); 15 $newIdsData = array_filter( 16 $idsArr, 17 function ($item) use ($idsMap) { 18 return $idsMap[$item] == 1; 19 } 20 );
参考链接:https://www.php.net/manual/zh/language.operators.bitwise.php