var_dump($sameArr, $diffA, $diffB);
返回结果是:
也是正确的,预期结果。
三、方案对比
既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。
函数大小在千数级别时两者的效率是差不多的代码如下:
使用array_search和for循环执行
/*$A = array('tt','cc','dd','mm');
$B = array('ad','tt','cc','qq');*/
for($i=0; $i1000; $i++){ if($i%53 == 0){ $A[] = 'B_' . $i; } else { $A[] = 'A_' . $i; }
}
for($i=0; $i1000; $i++){ if($i%73 == 0){ $B[] = 'A_' . $i; } else { $B[] = 'B_' . $i; }
}runtime
();
$sameArr = array();
for($i=0; $icount($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; $i10000; $i++){ if($i%53 == 0){ $A[] = 'B_' . $i; } else { $A[] = 'A_' . $i; }
}
for($i=0; $i10000; $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形式