PHP实现的数组交集运算
PHP实现的数组交集运算,使用递归方式进行数组的合并运算,在编码过程中应该注意到array_merge()、+以及array_merge_recursive()在数组合并时的差异。
array_merge():
把两个或多个数组合并为一个数组。
如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的)。如果数组是数字索引的,则键名会以连续方式重新索引。
如果仅仅向 array_merge() 函数输入了一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
+:
两个数组相加,只是追加不存在的键名和对应的值,键名不重新索引。
array_merge_recursive():
将一个或多个数组的元素的合并起来,一个数组中的值附加在前一个数组的后面。并返回作为结果的数组。
但是,与array_merge()不同的是,当有重复的键名时,值不会被覆盖,而是将多个相同键名的值递归组成一个数组。
1 <?php 2 3 /** 4 * @email modofu@163.com 5 * @author modofu.chen 6 * @copyright 2013 7 * 多数组取交集运算 8 * 使用方法: 9 * ArrayIntersection ($array1,[$array2,$array3...]); 10 * 参数可变,且需要都为数组。 11 * 12 */ 13 14 function ArrayIntersection () 15 { 16 $ParamNum = func_num_args (); 17 $Params = func_get_args (); 18 for ($i = 0; $i < $ParamNum ; $i ++) 19 { 20 if (!is_array ($Params[$i])) 21 { 22 unset ($Params[$i]); 23 } 24 } 25 unset ($ParamNum); 26 $UnionArray = array (); 27 for ($j = 0; $j < count ($Params) ; $j++) 28 $UnionArray = array_merge_recursive($UnionArray , $Params[$j]); 29 unset ($Params); 30 $NewArray = array (); 31 Recursion($UnionArray , $NewArray); 32 unset ($UnionArray); 33 $UniqueArray = array_Unique($NewArray); 34 $RepeatArray = array_diff_assoc ($NewArray , $UniqueArray); 35 unset($NewArray , $UniqueArray); 36 $RepeatArray = array_unique($RepeatArray); 37 printf ($RepeatArray); 38 39 } 40 41 function Recursion (&$_UnionArray , &$_Returnarray) 42 { 43 foreach ($_UnionArray as $key => $value) 44 { 45 if (!is_array ($_UnionArray[$key])) 46 { 47 array_push ($_Returnarray , $_UnionArray[$key]); 48 } 49 else 50 { 51 Recursion($_UnionArray[$key] , $_Returnarray); 52 } 53 } 54 } 55 56 ?>