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

原创
2016-06-13 10:51:54 597浏览

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; $icount($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; $i1000; $i++){
      4. if($i%53 == 0){
      5. $A[] = 'B_' . $i;
      6. } else {
      7. $A[] = 'A_' . $i;
      8. }
      9. }
      10. for($i=0; $i1000; $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; $icount($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; $i10000; $i++){
        4. if($i%53 == 0){
        5. $A[] = 'B_' . $i;
        6. } else {
        7. $A[] = 'A_' . $i;
        8. }
        9. }
        10. for($i=0; $i10000; $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) {
nbsp array sameArr 100000 currPHP课程HTML视频教程CSS视频JS视频教程Vue视频教程
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
上一条:找工作和对刚刚学PHP的朋友的忠告 下一条:新手问个很简单的PHP有关问题

相关文章

查看更多
打开APP,随时随地在线学习!