php分割两个数组的相同元素和不同元素的两种方法
一、举例说明例如有两个数组a和b(当然这个a和b也可以是key=>value形式)
a = array('tt','cc','dd','mm')b = array('ad','tt','cc','qq')希望得到的结果是:samearr = array('tt','cc')a = array('dd','mm')b = array('ad','qq')
二、解决方案2.1、方法一:for循环取出数据
1、for循环一个a数组;2、使用array_search判断元素是否存在b数组中;3、存在后unset a和b中的该元素;4、将该相同元素添加到samearr数组中具体代码:
0){ $samearr[] = $a[$i]; unset($a[$i]); unset($b[$pos]); } }var_dump($samearr, $a, $b);
key value数组形式和此类似,只需要将for循环替换为foreach循环即可,下面看一下运行结果:
返回结果是我们预期的结果。
2.2、方案二:利用php内置函数array_diff和array_intersect
同样也可以使用array_diff分割,获取在a中而不在b中的元素或者在b中而不在a中的元素,但是无法获取相同元素,要获取相同元素的话,需要使用。array_intersect函数来获取,方法如下:
返回结果是:
也是正确的,预期结果。
三、方案对比 既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。
函数大小在千数级别时两者的效率是差不多的代码如下:
使用array_search和for循环执行
0){ $samearr[] = $a[$i]; unset($a[$i]); unset($b[$pos]); } }//var_dump($samearr, $a, $b);runtime('end'); function runtime($mod='') { static $first; //首次运行时间 static $prev; //上次时间 static $str; //输出字符串 $time = explode(' ', microtime()); $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式 //首次 if(!$first) { $prev = $first = $curr+0; //$str .= '开始:'.$first.'秒
'; }else if($mod == 'end'){ $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '
'; //$str .= '结束: '.$curr.'秒
'; $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '
'; echo $str; }else{ $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '
'; $prev = $curr; } }使用php的内置函数: