PHP分割两个数组的相同元素和不同元素的两种方法
2012-10-10 16:31
1106 查看
一、举例说明
例如有两个数组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数组中
具体代码:
<?php
$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函数来获取,方法如下:<?php
$sameArr = array_intersect($A, $B);
$diffA = array_diff($A, $B);
$diffB = array_diff($B, $A);
var_dump($sameArr, $diffA, $diffB);
返回结果是:
也是正确的,预期结果。
三、方案对比
既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。函数大小在千数级别时两者的效率是差不多的代码如下:
使用array_search和for循环执行
<?php
/*$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.'秒<br/>';
}else if($mod == 'end'){
$str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
//$str .= '结束: '.$curr.'秒<br/>';
$str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
echo $str;
}else{
$str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
$prev = $curr;
}
}
使用PHP的内置函数:
<?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.'秒<br/>';
}else if($mod == 'end'){
$str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
//$str .= '结束: '.$curr.'秒<br/>';
$str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
echo $str;
}else{
$str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
$prev = $curr;
}
}
对比两者执行时间都是在0.002-0.006之间,相差不是很大。
而当我们的函数级别上升到万级别以上时,对比就非常明显了,第一种方法耗时为
本次: 2.63339
总运行时间:2.63339
大概在2.6秒钟,而使用第二种内置函数方法时,
本次: 0.03148
总运行时间:0.03148
耗时依然在0.002-0.006之间,当我面将数组级别上升到十万时,时间也在0.3-0.4之间徘徊。
可以看出大数组情况下最好使用PHP的内置函数,尽量减少for的循环调用。
相关文章推荐
- PHP瓜分两个数组的相同元素和不同元素的两种方法
- PHP瓜分两个数组的相同元素和不同元素的两种方法
- PHP实现查询两个数组中不同元素的方法
- php 比较获取两个数组相同和不同元素(交集和差集)
- PHP实现查询两个数组中不同元素的方法
- php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集)
- PHP实现查询两个数组中不同元素的方法
- PHP删除二维数组中相同元素及数组重复值的方法示例
- Java对数组的操作(三)—比较两个数组中的元素是否相同的最简单方法
- php中比较两个数组内容,相同部分保留,不同的加上
- 累加两个php数组,键相同的累加,不同的合并
- php 查询两个数组中值相同的元素(并且去掉重复值)
- php将字符串随机分割成不同长度数组的方法
- 数组合并删除两个相同元素方法
- PHP删除数组中特定元素的两种方法
- 总结一种线性复杂度求两个数组(容器)求相同元素个数的方法
- PHP-查询两个数组中的不同元素
- php合并数组中相同元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- JAVA两个数组间元素的比较(找出相同或者不同元素)