本帖最后由 loveunh1982 于 2014-06-06 18:49:00 编辑

解决方案 »

  1.   

    能否实现array_diff 类似的效果呢,如果一样就返回空数组,如果不一样,就返回差集
      

  2.   

    print_r(array_diff_recursive($arr1, $arr2));
    print_r(array_diff_recursive($arr2, $arr1));function array_diff_recursive($a, $b) {
      $res = array();
      if(is_numeric(key($a))) { //如果是下标数组,处理上还不尽如人意
        foreach($a as $s) {
          $r = false;
          foreach($b as $k=>$v) {
            if($s == $v) {
              unset($b[$k]);
              $r = true;
              break;
            }
          }
          if(! $r) $res[] = $s;
        }
        return $res;
      }
      foreach(array_diff(array_keys($a),array_keys($b)) as $k) $res[$k] = $a[$k];
      if($res)  return $res;
      foreach($a as $k=>$v) {
        if($v == $b[$k]) continue;
        if(is_array($v)) {
          if($t = call_user_func_array( __FUNCTION__, array($v, $b[$k]))) $res[$k] = $t;
        }else $res[$k] = $v;
      }   
      return $res;
    }
      

  3.   

    换个算法function array_diff_recursive($a, $b, &$res=array()) {
      if($a == $b) return $res = array();
      $res = $a;
      if(is_array($a)) {
        foreach($a as $k=>$v) {
          if(is_numeric($k)) {
            foreach($b as $i=>$t) if($v == $t) unset($res[$k]);
          }else {
            if(isset($b[$k])) array_diff_recursive($a[$k], $b[$k], $res[$k]);
          }
        }
      }
      if(is_array($res)) foreach($res as $k=>$v) if($v == array()) unset($res[$k]);
      return $res;
    }