读书人

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

发布时间: 2012-10-23 12:12:22 作者: rapoo

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. <?php
  2. $A = array('tt','cc','dd','mm');
  3. $B = array('ad','tt','cc','qq');
  4. $sameArr = array();
  5. for($i=0; $i<count($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循环即可,下面看一下运行结果:PHP瓜分两个数组的相同元素和不同元素的两种方法
PHP瓜分两个数组的相同元素和不同元素的两种方法返回结果是我们预期的结果。
2.2、方案二:利用PHP内置函数array_diff和array_intersect同样也可以使用array_diff分割,获取在A中而不在B中的元素或者在B中而不在A中的元素,但是无法获取相同元素,要获取相同元素的话,需要使用。array_intersect函数来获取,方法如下:
  1. <?php
  2. $sameArr = array_intersect($A, $B);
  3. $diffA = array_diff($A, $B);
  4. $diffB = array_diff($B, $A);
  5. var_dump($sameArr, $diffA, $diffB);

返回结果是:PHP瓜分两个数组的相同元素和不同元素的两种方法
PHP瓜分两个数组的相同元素和不同元素的两种方法也是正确的,预期结果。
三、方案对比 既然两种方案都能够满足我们现有的需求,那么接下来我们就来分析两种方法区别,以及哪种方法更优。函数大小在千数级别时两者的效率是差不多的代码如下:使用array_search和for循环执行
  1. <?php
  2. /*$A = array('tt','cc','dd','mm');
  3. $B = array('ad','tt','cc','qq');*/
  4. for($i=0; $i<1000; $i++){
  5. if($i%53 == 0){
  6. $A[] = 'B_' . $i;
  7. } else {
  8. $A[] = 'A_' . $i;
  9. }
  10. }
  11. for($i=0; $i<1000; $i++){
  12. if($i%73 == 0){
  13. $B[] = 'A_' . $i;
  14. } else {
  15. $B[] = 'B_' . $i;
  16. }
  17. }
  18. runtime();
  19. $sameArr = array();
  20. for($i=0; $i<count($A); $i++){
  21. $pos = array_search($A[$i], $B);
  22. if($pos>0){
  23. $sameArr[] = $A[$i];
  24. unset($A[$i]);
  25. unset($B[$pos]);
  26. }
  27. }
  28. //var_dump($sameArr, $A, $B);
  29. runtime('end');
  30. function runtime($mod='')
  31. {
  32. static $first; //首次运行时间
  33. static $prev; //上次时间
  34. static $str; //输出字符串
  35. $time = explode(' ', microtime());
  36. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式
  37. //首次
  38. if(!$first) {
  39. $prev = $first = $curr+0;
  40. //$str .= '开始:'.$first.'秒<br/>';
  41. }else if($mod == 'end'){
  42. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  43. //$str .= '结束: '.$curr.'秒<br/>';
  44. $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
  45. echo $str;
  46. }else{
  47. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  48. $prev = $curr;
  49. }
  50. }
使用PHP的内置函数:
  1. <?php
  2. /*$A = array('tt','cc','dd','mm','da','dv','dc','de','df');
  3. $B = array('ad','tt','cc','qq');*/
  4. for($i=0; $i<10000; $i++){
  5. if($i%53 == 0){
  6. $A[] = 'B_' . $i;
  7. } else {
  8. $A[] = 'A_' . $i;
  9. }
  10. }
  11. for($i=0; $i<10000; $i++){
  12. if($i%73 == 0){
  13. $B[] = 'A_' . $i;
  14. } else {
  15. $B[] = 'B_' . $i;
  16. }
  17. }
  18. runtime();
  19. $sameArr = array_intersect($A, $B);
  20. $diffA = array_diff($A, $B);
  21. $diffB = array_diff($B, $A);
  22. //var_dump($sameArr, $diffA, $diffB);
  23. runtime('end');
  24. function runtime($mod='')
  25. {
  26. static $first; //首次运行时间
  27. static $prev; //上次时间
  28. static $str; //输出字符串
  29. $time = explode(' ', microtime());
  30. $curr = $time[1] . substr($time[0], 1, 7); // 1212466268.034119形式
  31. //首次
  32. if(!$first) {
  33. $prev = $first = $curr+0;
  34. //$str .= '开始:'.$first.'秒<br/>';
  35. }else if($mod == 'end'){
  36. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  37. //$str .= '结束: '.$curr.'秒<br/>';
  38. $str .= '总运行时间:'.intval(($curr - $first) * 100000)/100000 . '<br/>';
  39. echo $str;
  40. }else{
  41. $str .= '本次: '.intval(($curr - $prev) * 100000)/100000 . '<br/>';
  42. $prev = $curr;
  43. }
  44. }
对比两者执行时间都是在0.002-0.006之间,相差不是很大。
而当我们的函数级别上升到万级别以上时,对比就非常明显了,第一种方法耗时为本次: 2.63339
总运行时间:2.63339
大概在2.6秒钟,而使用第二种内置函数方法时,本次: 0.03148
总运行时间:0.03148
耗时依然在0.002-0.006之间,当我面将数组级别上升到十万时,时间也在0.3-0.4之间徘徊。
可以看出大数组情况下最好使用PHP的内置函数,尽量减少for的循环调用。



读书人网 >PHP

热点推荐