当前位置:Gxlcms > PHP教程 > PHP瓜分两个数组的相同元素和不同元素的两种方法

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数组中

具体代码:

  1. $A = array('tt','cc','dd','mm');

  2. $B = array('ad','tt','cc','qq');

  3. $sameArr = array();

  4. for($i=0; $i<count($A); $i++){

  5. $pos = array_search($A[$i], $B);

  6. if($pos>0){

  7. $sameArr[] = $A[$i];

  8. unset($A[$i]);

  9. unset($B[$pos]);

  10. }

  11. }

  12. 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. $sameArr = array_intersect($A, $B);

  2. $diffA = array_diff($A, $B);

  3. $diffB = array_diff($B, $A);

  4. var_dump($sameArr, $diffA, $diffB);


返回结果是:


也是正确的,预期结果。


三、方案对比

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

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

使用array_search和for循环执行

  1. /*$A = array('tt','cc','dd','mm');

  2. $B = array('ad','tt','cc','qq');*/

  3. for($i=0; $i<1000; $i++){

  4. if($i%53 == 0){

  5. $A[] = 'B_' . $i;

  6. } else {

  7. $A[] = 'A_' . $i;

  8. }

  9. }

  10. for($i=0; $i<1000; $i++){

  11. if($i%73 == 0){

  12. $B[] = 'A_' . $i;

  13. } else {

  14. $B[] = 'B_' . $i;

  15. }

  16. }

  17. runtime();

  18. $sameArr = array();

  19. for($i=0; $i<count($A); $i++){

  20. $pos = array_search($A[$i], $B);

  21. if($pos>0){

  22. $sameArr[] = $A[$i];

  23. unset($A[$i]);

  24. unset($B[$pos]);

  25. }

  26. }

  27. //var_dump($sameArr, $A, $B);

  28. runtime('end');

  29. function runtime($mod='')

  30. {

  31. static $first; //首次运行时间

  32. static $prev; //上次时间

  33. static $str; //输出字符串

  34. $time = explode(' ', microtime());

  35. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式

  36. //首次

  37. if(!$first) {

  38. $prev = $first = $curr+0;

  39. //$str .= '开始:'.$first.'秒
    ';

  40. }else if($mod == 'end'){

  41. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '
    '
    ;

  42. //$str .= '结束: '.$curr.'秒
    ';

  43. $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '
    '
    ;

  44. echo $str;

  45. }else{

  46. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '
    '
    ;

  47. $prev = $curr;

  48. }

  49. }

使用PHP的内置函数:

  1. /*$A = array('tt','cc','dd','mm','da','dv','dc','de','df');

  2. $B = array('ad','tt','cc','qq');*/

  3. for($i=0; $i<10000; $i++){

  4. if($i%53 == 0){

  5. $A[] = 'B_' . $i;

  6. } else {

  7. $A[] = 'A_' . $i;

  8. }

  9. }

  10. for($i=0; $i<10000; $i++){

  11. if($i%73 == 0){

  12. $B[] = 'A_' . $i;

  13. } else {

  14. $B[] = 'B_' . $i;

  15. }

  16. }

  17. runtime();

  18. $sameArr = array_intersect($A, $B);

  19. $diffA = array_diff($A, $B);

  20. $diffB = array_diff($B, $A);

  21. //var_dump($sameArr, $diffA, $diffB);

  22. runtime('end');

  23. function runtime($mod='')

  24. {

  25. static $first; //首次运行时间

  26. static $prev; //上次时间

  27. static $str; //输出字符串

  28. $time = explode(' ', microtime());

  29. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式

  30. //首次

  31. if(!$first) {

  32. $prev = $first = $curr+0;

  33. //$str .= '开始:'.$first.'秒
    ';

  34. }else if($mod == 'end'){

  35. $str .= '本次: '.intval((

人气教程排行