Home > Backend Development > PHP Tutorial > PHP瓜分两个数组的相同元素和不同元素的两种方法

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

WBOY
Release: 2016-06-13 10:51:54
Original
911 people have browsed it

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

        使用PHP的内置函数:

        1. /*$A = array('tt','cc','dd','mm','da','dv','dc','de','df');
        2. $B = array('ad','tt','cc','qq');*/
        3.  
        4. for($i=0; $i10000; $i++){
        5.         if($i%53 == 0){
        6.                 $A[] = 'B_' . $i;
        7.         } else {
        8.                 $A[] = 'A_' . $i;
        9.         }
        10. }
        11.  
        12. for($i=0; $i10000; $i++){
        13.         if($i%73 == 0){
        14.                 $B[] = 'A_' . $i;
        15.         } else {
        16.                 $B[] = 'B_' . $i;
        17.         }
        18. }
        19.  
        20. runtime();
        21. $sameArr = array_intersect($A, $B);
        22. $diffA = array_diff($A, $B);
        23. $diffB = array_diff($B, $A);
        24. //var_dump($sameArr, $diffA, $diffB);
        25. runtime('end');
        26.  
        27. function runtime($mod='')    
        28. {    
        29.     static $first; //首次运行时间    
        30.     static $prev; //上次时间    
        31.     static $str;    //输出字符串    
        32.     $time = explode(' ', microtime());    
        33.     $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式    
        34.     //首次    
        35.     if(!$first) {    
        36.         
Related labels:
source:php.cn
Previous article:找工作和对刚刚学PHP的朋友的忠告 Next article:新手问个很简单的PHP有关问题
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Latest Issues
Related Topics
More>
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template