php取不定个数数组交集、并集(以空间换时间)

对于两个或者多个(个数确定)数组取交并集非常简单,通过内置函数:

$fruit1 = array("Apple","Banana","Orange"); $fruit2 = array("Pear","Apple","Grape"); $fruit3 = array("Watermelon","Orange","Apple"); $intersection = array_intersect($fruit1, $fruit2, $fruit3); print_r($intersection);

二维数组取交并集,我们可以循环法:

  $arr=array(
    array('a'=>'1',2),
     array(3,4)
  );
  $ar=array(
     array('a'=>1,2),
     array(3,4)
  );
  foreach ($arr as $value){
      foreach ($ar as $val){
          if($value==$val){
              $nearr[]=$value;
          }
      }
  }
  print_r($nearr);

但是如果一个需求是,通过勾选多少组数据,然后对这N组数据进行取交集,你该怎么办?
这时候你不可方便的建立N层循环来进行取交集,引入一个以空间换时间的概念:

var preadkpis = {
    arrayintersect : function () { //数组取交集
    var result = new Array();
        var obj = {};
        for (var i = 0; i < arguments.length; i++) {
            for (var j = 0; j < arguments[i].length; j++) {
                var str = arguments[i][j];
                if (!obj[str]) {
                    obj[str] = 1;
                }
                else {
                    obj[str]++;
                    if (obj[str] == arguments.length)
                    {
                        result.push(str);
                    }
                }
            }
        }
        return result;
    },
    arrayunion : function (a,b) {  //数组取并集
        var arr = new Array();
        var obj = {};
        for (var i = 0; i < arguments.length; i++) {
            for (var j = 0; j < arguments[i].length; j++)
            {
                var str=arguments[i][j];
                if (!obj[str])
                {
                    obj[str] = 1;
                    arr.push(str);
                }
            }
        }
        return arr;
    },

    arrayminus : function (a,b) {  //数组取差集
        var result = new Array();
            var obj = {};
            for (var i = 0; i < arr.length; i++) {
                obj[arr[i]] = 1;
            }
            for (var j = 0; j < this.length; j++) {
                if (!obj[this[j]])
                {
                    obj[this[j]] = 1;
                    result.push(this[j]);
                }
            }
            return result;
    },
    arrayuniquelize :function(a) { // 去重
        var tmp = {},
            ret = [];
        for (var i = 0, j = this.length; i < j; i++) {
            if (!tmp[this[i]]) {
                tmp[this[i]] = 1;
                ret.push(this[i]);
            }
        }

        return ret;
    }
}

使用方法:

var args=[];
$('input.toolcheck:checked').each(function(){
  var curcon=$(this).val();
  args.push(curcon);
});
  // 通过jq获取勾选内容,到达这里args形式(需要变化为arguments参数方式传入函数)
  // args=[
  //   '12,35,69,869,569,45,23,81',
  //   '12,35,64,869,569,45,23,84',
  //   '12,35,62,869,569,45,23,80',
  // ],

var strs = [];
for(var key in args){
    strs.push('args['+key+'].split(\',\')');
}

var fn = 'var k=preadkpis.arrayintersect('+strs.toString()+')';
eval(fn);

k.toString()就是最后得到的交集并转化为了字符串以供展示

猜你喜欢

转载自blog.csdn.net/jiedao_liyk/article/details/78854299
今日推荐