- php数组处理案例(即Array函数)
- 更多参考(约80个函数):
- 1、arsort/asort/ksort/krsort
- 2、key(array)
- 3、compact(var1,var2…)
- 4、array_count_values(array)
- 5、array_combine(keys,values)
- 6、array_chunk(array,size,preserve_keys)
- 7、array_flip(array)
- 8、array_unshift/array_shift/array_push/array_pop
- 9、array_column
- 10、array_values
- 11、in_array()
- 12、array_push
- 13、array_map()
- 14、array_filter
- 15-1、array_diff(array $array, array …$arrays): array
- 15-2 array_intersect()
- 16、filter_var(variable, filter, options)
- 17、array_unique()
- 18、array_values/array_key_exists
- 19、array_column/array_multisort
php数组处理案例(即Array函数)
更多参考(约80个函数):
https://www.runoob.com/php/php-ref-array.html
1、arsort/asort/ksort/krsort
arsort(array,sortingtype)键值进行降序排序。
asort键值进行升序排序。
ksort() 键名进行升序排序。
krsort() 键名进行降序排序。
$arr = ["zhang"=>26,"li"=>30,"wang"=>5];arsort($arr);print_r($arr);//输出 Array ( [li] => 30 [zhang] => 26 [wang] => 5 )
2、key(array)
从当前内部指针位置返回元素键名。
current(array)返回数组中的当前元素的值。$arr2 = [“26","30","5"];$arr3 = [“zhang","li","wang"];$arr1 = [“zhang"=>26,"li"=>30,"wang"=>5];echo key($arr2);echo key($arr3);echo key($arr1);echo “<br>";echo current($arr2);echo current($arr3);echo current($arr1);//输出00zhang26zhang26
3、compact(var1,var2…)
创建一个包含变量名和它们的值的数组。
$zhang = ‘26’;$li = ‘30’;print_r(compact(“zhang","li"));//输出 Array ( [zhang] => 26 [li] => 30 )
4、array_count_values(array)
统计数组中所有值出现的次数。
$arr4 = [“A","Cat","Dog","A","Dog"];print_r(array_count_values($arr4));//输出 Array ( [A] => 2 [Cat] => 1 [Dog] => 2 )
5、array_combine(keys,values)
合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组的元素为键值。
$arr2 = [“26","30","5"];$arr3 = [“zhang","li","wang"];print_r(array_combine($arr3,$arr2));//输出 Array ( [zhang] => 26 [li] => 30 [wang] => 5 )
6、array_chunk(array,size,preserve_keys)
把一个数组分割为新的数组块。
$arr3 = [“zhang","li","wang"];var_dump(array_chunk($arr3,2));//输出[[0=>’zhang’,1=>’li’,],[0=>’wang’]]
二维数组+键值对,array_chunk照样正常切割
array_chunk不关心一维还是二维、是不是键值对,只按元素个数拆分。
1. 二维键值对数组示例
// 二维数组,每条都是键值对数据库数据$allData = [['id'=>1,'name'=>'张三'],['id'=>2,'name'=>'李四'],['id'=>3,'name'=>'王五'],['id'=>4,'name'=>'赵六'],['id'=>5,'name'=>'钱七'],];// 每2条切一块$chunks = array_chunk($allData, 2);
拆分后结果
[// 第一块[['id'=>1,'name'=>'张三'],['id'=>2,'name'=>'李四']],// 第二块[['id'=>3,'name'=>'王五'],['id'=>4,'name'=>'赵六']],// 最后不足2条自成一块[['id'=>5,'name'=>'钱七']]]
2. 保留原数组下标(第三个参数true)
$chunks = array_chunk($allData, 2, true);
仅外层数组下标保留,内层数据结构不变。
3. TP批量插入实战代码(二维数组通用)
// 上万条二维入库数据$bigData = [];$batch = 500;// 自动分批$chunkList = array_chunk($bigData, $batch);foreach ($chunkList as $rowData) {// 直接插入,结构完全兼容insertAllDb::name('user')->insertAll($rowData);}
7、array_flip(array)
反转/交换数组中的键名和对应关联的键值。
$arr1 = [“zhang"=>26,"li"=>30,"wang"=>5];print_r(array_flip($arr1));//输出 Array ( [26] => zhang [30] => li [5] => wang )
8、array_unshift/array_shift/array_push/array_pop
$arr1 = [“zhang"=>26,"li"=>30,"wang"=>5];array_unshift($arr1,’liu’);//在数组开头插入一个或多个元素。array_shift($arr1);//删除数组中的第一个元素,并返回被删除的元素。array_push($arr1,’qin’);//向数组尾部插入一个或多个元素。array_pop($arr1);//删除数组中的最后一个元素。print_r($arr1);//输出// Array ( [0] => liu [zhang] => 26 [li] => 30 [wang] => 5 )// Array ( [li] => 30 [wang] => 5 )// Array ( [zhang] => 26 [li] => 30 [wang] => 5 [0] => qin )// Array ( [zhang] => 26 [li] => 30 )
9、array_column
返回输入数组中某个单一列的值。
$a = array(array(‘id’ => 5698,‘first_name’ => ‘Peter’,‘last_name’ => ‘Griffin’,),array(‘id’ => 4767,‘first_name’ => ‘Ben’,‘last_name’ => ‘Smith’,),array(‘id’ => 3809,‘first_name’ => ‘Joe’,‘last_name’ => ‘Doe’,));$last_names = array_column($a, ‘last_name’);输出:Array([0] => Griffin[1] => Smith[2] => Doe)
10、array_values
返回数组中所有的值(不保留键名)
$a=array(“Name"=>"Peter","Age"=>"41","Country"=>"USA");print_r(array_values($a));Array ( [0] => Peter [1] => 41 [2] => USA )
11、in_array()
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
12、array_push
函数向数组尾部插入一个或多个元素array_push(array,value1,value2…)
13、array_map()
函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组。
function myfunction($num){return($num*$num);}$a=array(1,2,3,4,5);print_r(array_map(“myfunction",$a));Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )或者:// 使用array_map将二维数组转换为一维数组,以便可以使用array_unique$uniqueArray = array_map(“serialize", array_unique(array_map(“serialize", $array)));// 将序列化后的字符串数组转回原来的数组格式$uniqueArray = array_map(“unserialize", $uniqueArray);// 达到去重复的目的print_r($uniqueArray);
14、array_filter
用回调函数过滤数组中的元素:
function test_odd($var){return($var & 1);}$a1=array("a","b",2,3,4);print_r(array_filter($a1,"test_odd"));Array ( [3] => 3 )如果你不传第二个参数(回调函数),array_filter 会自动删除数组中所有“空”的元素。PHP 认为以下元素是“空”的:null、false、0、0.0、空字符串 ''、字符串 '0' 以及空数组。例如:$entry = [0 => 'foo', 1 => false, 2 => -1, 3 => null, 4 => '', 5 => '0', 6 => 0];print_r(array_filter($entry));// 输出结果:Array ( [0] => foo [2] => -1 )
15-1、array_diff(array $array, array …$arrays): array
用于计算数组差集的函数。它对比一个或多个数组,返回在第一个数组中但不在其他数组中出现的值。
- 典型使用场景
- 找出被删除的项:array_diff($oldList, $newList)
- 找出新增的项:array_diff($newList, $oldList)
- 过滤黑名单:array_diff($userInput, $blockedWords)
- 权限对比:找出用户被移除的权限
// 示例1:$array1 = array("a" => "green", "red", "blue", "red");$array2 = array("b" => "green", "yellow", "red");$result = array_diff($array1, $array2);print_r($result);# 返回一个数组,该数组包括了所有在 array 中但是不在任何其它参数数组中的值。注意键名保留不变。Array([1] => blue)// 示例2:$a = ["apple", "banana", "orange", "pear"];$b = ["banana", "pear", "grape"];$result = array_diff($a, $b);print_r($result);Array([0] => apple[2] => orange)
15-2 array_intersect()
它用于计算数组的交集——即返回在第一个数组中且同时存在于所有其他数组中的值。
- 签匹配:找出两篇文章的共同标签
- 过滤白名单:array_intersect($input, $whitelist)
与 array_diff() 相反的函数是 array_intersect(),它用于计算数组的交集——即返回在第一个数组中且同时存在于所有其他数组中的值。
基本用法
array_intersect(array $array, array ...$arrays): array
$a = ["apple", "banana", "orange", "pear"];$b = ["banana", "pear", "grape"];$result = array_intersect($a, $b);print_r($result);
输出:
Array([1] => banana[3] => pear)
返回的是
$a和$b共同拥有的元素,同样保留原始键名。
与 array_diff() 的直观对比
| 函数 | 逻辑 | 口诀 |
|---|---|---|
array_diff($a, $b) |
在 $a 中,但不在 $b 中 |
“我有你没有” |
array_intersect($a, $b) |
在 $a 中,且也在 $b 中 |
“大家都有” |
$a = [1, 2, 3, 4];$b = [2, 4, 6];print_r(array_diff($a, $b)); // [1, 3] → 差集print_r(array_intersect($a, $b)); // [2, 4] → 交集
相关变体函数(与 array_diff 系列一一对应)
| 交集函数 | 比较维度 | 对应差集函数 |
|---|---|---|
array_intersect() |
值 | array_diff() |
array_intersect_key() |
键名 | array_diff_key() |
array_intersect_assoc() |
键 + 值 | array_diff_assoc() |
array_uintersect() |
值(自定义回调) | array_udiff() |
array_intersect_uassoc() |
键(自定义回调)+ 值 | array_diff_uassoc() |
array_uintersect_assoc() |
键 + 值(自定义值回调) | array_udiff_assoc() |
array_uintersect_uassoc() |
键和值均自定义回调 | array_udiff_uassoc() |
注意事项(与 array_diff 相同)
- 只比较值(默认),使用字符串比较,
1和"1"视为相同 - 保留原键名,如需重新索引用
array_values(array_intersect(...)) - 不支持多维数组
- 大数组同样存在 O(n×m) 复杂度问题
16、filter_var(variable, filter, options)
PHP 内置的一个数据过滤/验证函数。 用指定的规则去检查或净化一个变量。如果检查通过,返回原数据;如果检查不通过,返回 false。 过虑值(FILTER_VALIDATE_EMAIL)可能有:https://www.runoob.com/php/php-ref-filter.html
filter_var(要处理的数据, 过滤器类型, 过滤器选项);if(!filter_var("someone@example....com", FILTER_VALIDATE_EMAIL)){echo("E-mail is not valid");} else {echo("E-mail is valid");}结果 :E-mail is not validfilter_var('192.168.1.1', FILTER_VALIDATE_IP); // 返回 '192.168.1.1'(通过)filter_var('256.1.1.1', FILTER_VALIDATE_IP); // 返回 false(不通过,256超了)filter_var('abc', FILTER_VALIDATE_IP); // 返回 false(不通过,根本不是IP)filter_var('::1', FILTER_VALIDATE_IP); // 返回 '::1'(通过,这是IPv6)if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {echo "不是合法的IP4地址";}另外还有:filter_var_array()
17、array_unique()
函数用于移除数组中重复的值。如果两个或更多个数组值相同,只保留第一个值,其他的值被移除。
$a=array(“a"=>"red","b"=>"green","c"=>"red");print_r(array_unique($a));Array ( [a] => red [b] => green )
18、array_values/array_key_exists
二维数组以name的去重
// 初始化一个关联数组来存储唯一名称的供应商$uniqueSuppliers = [];// 遍历原始数组foreach ($supplier_arr as $item) {// 使用name作为键,如果键不存在则添加到结果数组if (!array_key_exists($item['name'], $uniqueSuppliers)) {$uniqueSuppliers[$item['name']] = $item;}}// 将关联数组转换为索引数组(可选)$supplier_arr_unique = array_values($uniqueSuppliers);
19、array_column/array_multisort
二维数据排序
$temp= array_column($stock_details,'qty');array_multisort($temp, SORT_ASC, $stock_details);
