PHP分割两个数组的相同元素和不同元素的两种方法
Posted danhuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数组中 具体代码:- <?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
- /*$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 ;
而当我们的函数级别上升到万级别以上时,对比就非常明显了,第一种方法耗时为 本次: 2.63339
总运行时间:2.63339 大概在2.6秒钟,而使用第二种内置函数方法时, 本次: 0.03148
总运行时间:0.03148 耗时依然在0.002-0.006之间,当我面将数组级别上升到十万时,时间也在0.3-0.4之间徘徊。
可以看出大数组情况下最好使用PHP的内置函数,尽量减少for的循环调用。
以上是关于PHP分割两个数组的相同元素和不同元素的两种方法的主要内容,如果未能解决你的问题,请参考以下文章
破解大厂算法面试最难动态规划题:将数组分割成元素和相等的两部分