PHP瓜分两个数组的相同元素和不同元素的两种方法
时间:2021-07-01 10:21:17
帮助过:25人阅读
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数组中具体代码:
-
- $A = array('tt','cc','dd','mm');
- $B = array('ad','tt','cc','qq');
- $sameArr = array();
- for($i=0; $i<count($A); $i++){
- $pos = array_search($A[$i], $B);
- if($pos>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函数来获取,方法如下:
- $sameArr = array_intersect($A, $B);
- $diffA = array_diff($A, $B);
- $diffB = array_diff($B, $A);
- var_dump($sameArr, $diffA, $diffB);
返回结果是:
也是正确的,预期结果。
三、方案对比
既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。
函数大小在千数级别时两者的效率是差不多的代码如下:
使用array_search和for循环执行
- /*$A = array('tt','cc','dd','mm');
- $B = array('ad','tt','cc','qq');*/
-
- for($i=0; $i<1000; $i++){
- if($i%53 == 0){
- $A[] = 'B_' . $i;
- } else {
- $A[] = 'A_' . $i;
- }
- }
-
- for($i=0; $i<1000; $i++){
- if($i%73 == 0){
- $B[] = 'A_' . $i;
- } else {
- $B[] = 'B_' . $i;
- }
- }
- runtime();
- $sameArr = array();
- for($i=0; $i<count($A); $i++){
- $pos = array_search($A[$i], $B);
- if($pos>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的内置函数:
- /*$A = array('tt','cc','dd','mm','da','dv','dc','de','df');
- $B = array('ad','tt','cc','qq');*/
-
- for($i=0; $i<10000; $i++){
- if($i%53 == 0){
- $A[] = 'B_' . $i;
- } else {
- $A[] = 'A_' . $i;
- }
- }
-
- for($i=0; $i<10000; $i++){
- if($i%73 == 0){
- $B[] = 'A_' . $i;
- } else {
- $B[] = 'B_' . $i;
- }
- }
-
- runtime();
- $sameArr = array_intersect($A, $B);
- $diffA = array_diff($A, $B);
- $diffB = array_diff($B, $A);
- //var_dump($sameArr, $diffA, $diffB);
- 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((