ホームページ > バックエンド開発 > PHPチュートリアル > PHP瓜分两个数组的相同元素和不同元素的两种方法

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

WBOY
リリース: 2016-06-13 10:51:54
オリジナル
910 人が閲覧しました

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.         
関連ラベル:
ソース:php.cn
前の記事:找工作和对刚刚学PHP的朋友的忠告 次の記事:新手问个很简单的PHP有关问题
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート