欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-05 10:50:19
...
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循环即可,下面看一下运行结果:
    PHP瓜分两个数组的相同元素和不同元素的两种方法
    PHP瓜分两个数组的相同元素和不同元素的两种方法
    返回结果是我们预期的结果。

    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);


      返回结果是:

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

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

      也是正确的,预期结果。


      三、方案对比

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

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

      使用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());

上一篇: oracle 11g R2 单实例 ASM 启动:ORA

下一篇: 适用于企业级别建站首选利器_PHP教程

推荐阅读