前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP分割两个数组的相同元素和不同元素的两种方法

PHP分割两个数组的相同元素和不同元素的两种方法

作者头像
蛋未明
发布2018-06-07 15:47:35
2.2K0
发布2018-06-07 15:47:35
举报
文章被收录于专栏:蛋未明的专栏

一、举例说明

例如有两个数组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数组中

具体代码:

  1. <?php
  2. $A = array('tt','cc','dd','mm');
  3. $B = array('ad','tt','cc','qq');
  4. $sameArr = array();
  5. for($i=0; $i<count($A); $i++){
  6. $pos = array_search($A[$i], $B);
  7. if($pos>0){
  8. $sameArr[] = $A[$i];
  9. unset($A[$i]);
  10. unset($B[$pos]);
  11. }
  12. }
  13. var_dump($sameArr, $A, $B);

key value数组形式和此类似,只需要将for循环替换为foreach循环即可,下面看一下运行结果:

返回结果是我们预期的结果。

2.2、方案二:利用PHP内置函数array_diff和array_intersect

同样也可以使用array_diff分割,获取在A中而不在B中的元素或者在B中而不在A中的元素,但是无法获取相同元素,要获取相同元素的话,需要使用。array_intersect函数来获取,方法如下:

  1. <?php
  2. $sameArr = array_intersect($A, $B);
  3. $diffA = array_diff($A, $B);
  4. $diffB = array_diff($B, $A);
  5. var_dump($sameArr, $diffA, $diffB);

返回结果是:

也是正确的,预期结果。

三、方案对比

  既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。

函数大小在千数级别时两者的效率是差不多的代码如下:

使用array_search和for循环执行

  1. <?php
  2. /*$A = array('tt','cc','dd','mm');
  3. $B = array('ad','tt','cc','qq');*/
  4. for($i=0; $i<1000; $i++){
  5. if($i%53 == 0){
  6. $A[] = 'B_' . $i;
  7. } else {
  8. $A[] = 'A_' . $i;
  9. }
  10. }
  11. for($i=0; $i<1000; $i++){
  12. if($i%73 == 0){
  13. $B[] = 'A_' . $i;
  14. } else {
  15. $B[] = 'B_' . $i;
  16. }
  17. }
  18. runtime();
  19. $sameArr = array();
  20. for($i=0; $i<count($A); $i++){
  21. $pos = array_search($A[$i], $B);
  22. if($pos>0){
  23. $sameArr[] = $A[$i];
  24. unset($A[$i]);
  25. unset($B[$pos]);
  26. }
  27. }
  28. //var_dump($sameArr, $A, $B);
  29. runtime('end');
  30. function runtime($mod='')
  31. {
  32.     static $first; //首次运行时间    
  33.     static $prev; //上次时间    
  34.     static $str; //输出字符串    
  35. $time = explode(' ', microtime());
  36. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式    
  37. //首次    
  38. if(!$first) {
  39. $prev = $first = $curr+0;
  40. //$str .= '开始:'.$first.'秒<br/>';    
  41. }else if($mod == 'end'){
  42. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  43. //$str .= '结束: '.$curr.'秒<br/>';    
  44. $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
  45. echo $str;
  46. }else{
  47. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  48. $prev = $curr;
  49. }
  50. }

使用PHP的内置函数:

  1. <?php
  2. /*$A = array('tt','cc','dd','mm','da','dv','dc','de','df');
  3. $B = array('ad','tt','cc','qq');*/
  4. for($i=0; $i<10000; $i++){
  5. if($i%53 == 0){
  6. $A[] = 'B_' . $i;
  7. } else {
  8. $A[] = 'A_' . $i;
  9. }
  10. }
  11. for($i=0; $i<10000; $i++){
  12. if($i%73 == 0){
  13. $B[] = 'A_' . $i;
  14. } else {
  15. $B[] = 'B_' . $i;
  16. }
  17. }
  18. runtime();
  19. $sameArr = array_intersect($A, $B);
  20. $diffA = array_diff($A, $B);
  21. $diffB = array_diff($B, $A);
  22. //var_dump($sameArr, $diffA, $diffB);
  23. runtime('end');
  24. function runtime($mod='')
  25. {
  26.     static $first; //首次运行时间    
  27.     static $prev; //上次时间    
  28.     static $str; //输出字符串    
  29. $time = explode(' ', microtime());
  30. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式    
  31. //首次    
  32. if(!$first) {
  33. $prev = $first = $curr+0;
  34. //$str .= '开始:'.$first.'秒<br/>';    
  35. }else if($mod == 'end'){
  36. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  37. //$str .= '结束: '.$curr.'秒<br/>';    
  38. $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
  39. echo $str;
  40. }else{
  41. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  42. $prev = $curr;
  43. }
  44. }

对比两者执行时间都是在0.002-0.006之间,相差不是很大。

而当我们的函数级别上升到万级别以上时,对比就非常明显了,第一种方法耗时为

本次: 2.63339 总运行时间:2.63339

大概在2.6秒钟,而使用第二种内置函数方法时,

本次: 0.03148 总运行时间:0.03148

耗时依然在0.002-0.006之间,当我面将数组级别上升到十万时,时间也在0.3-0.4之间徘徊。

可以看出大数组情况下最好使用PHP的内置函数,尽量减少for的循环调用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012年10月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、举例说明
  • 二、解决方案
    • 2.1、方法一:for循环取出数据
      • 2.2、方案二:利用PHP内置函数array_diff和array_intersect
      • 三、方案对比
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档