--TEST--
Test of the *intersect* bunch of functions (both assoc and non-assoc)
--FILE--
<?php
error_reporting(E_ALL|E_STRICT);
class cr {
	private $priv_member;
	public  $public_member;
	function cr($val) {
		$this->priv_member = $val;
		$this->public_member = $val;
	}
	static function comp_func_cr($a, $b) {
		if ($a->priv_member === $b->priv_member) return 0;
		return ($a->priv_member > $b->priv_member)? 1:-1;
	}

	function __toString() {
		return "Object";
	}
}

function comp_func($a, $b) {
	if ($a === $b) return 0;
	return ($a > $b)? 1:-1;

}

function comp_func_cr($a, $b) {
	if ($a->public_member === $b->public_member) return 0;
	return ($a->public_member > $b->public_member)? 1:-1;
}

$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr( 3), 1=> new cr(4), 2 => new cr(-15),);

/* array_intersect() */
echo "begin ------------ array_intersect() ----------------------------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_intersect($a, $b);'."\n";
var_dump(array_intersect($a, $b));
echo "end   ------------ array_intersect() ----------------------------\n";

/* array_uintersect() */
echo "begin ------------ array_uintersect() ---------------------------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_uintersect($a, $b, "comp_func_cr"));'."\n";
var_dump(array_uintersect($a, $b, "comp_func_cr"));
echo "end   ------------ array_uintersect() ---------------------------\n";

/* array_intersect_assoc() */
echo "begin ------------ array_intersect_assoc() ----------------------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_intersect_assoc($a, $b));'."\n";
var_dump(array_intersect_assoc($a, $b));
echo "end   ------------ array_intersect_assoc() ----------------------\n";

/* array_uintersect_assoc() */
echo "begin ------------ array_uintersect_assoc() ---------------------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_uintersect_assoc($a, $b, "comp_func_cr"));'."\n";
var_dump(array_uintersect_assoc($a, $b, "comp_func_cr"));
echo "end   ------------ array_uintersect_assoc() ---------------------\n";

/* array_intersect_uassoc() */
echo "begin ------------ array_intersect_uassoc() ---------------------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_intersect_uassoc($a, $b, "comp_func"));'."\n";
var_dump(array_intersect_uassoc($a, $b, "comp_func"));
echo "end   ------------ array_intersect_uassoc() ---------------------\n";

/* array_uintersect_uassoc() - with ordinary function */
echo "begin ------------ array_uintersect_uassoc() with ordinary func -\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_uintersect_uassoc($a, $b, "comp_func_cr", "comp_func"));'."\n";
var_dump(array_uintersect_uassoc($a, $b, "comp_func_cr", "comp_func"));
echo "end   ------------ array_uintersect_uassoc() with ordinary func -\n";

/* array_uintersect_uassoc() - by method call */
echo "begin ------------ array_uintersect_uassoc() with method --------\n";
echo '$a='.var_export($a,TRUE).";\n";
echo '$b='.var_export($b,TRUE).";\n";
echo 'var_dump(array_uintersect_uassoc($a, $b, array("cr", "comp_func_cr"), "comp_func"));'."\n";
var_dump(array_uintersect_uassoc($a, $b, array("cr", "comp_func_cr"), "comp_func"));
echo "end   ------------ array_uintersect_uassoc() with method --------\n";
?>
--EXPECTF--
begin ------------ array_intersect() ----------------------------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_intersect($a, $b);
array(5) {
  ["0.1"]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(9)
    ["public_member"]=>
    int(9)
  }
  ["0.5"]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(12)
    ["public_member"]=>
    int(12)
  }
  [0]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(23)
    ["public_member"]=>
    int(23)
  }
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_intersect() ----------------------------
begin ------------ array_uintersect() ---------------------------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_uintersect($a, $b, "comp_func_cr"));
array(3) {
  ["0.1"]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(9)
    ["public_member"]=>
    int(9)
  }
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_uintersect() ---------------------------
begin ------------ array_intersect_assoc() ----------------------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_intersect_assoc($a, $b));
array(4) {
  ["0.5"]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(12)
    ["public_member"]=>
    int(12)
  }
  [0]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(23)
    ["public_member"]=>
    int(23)
  }
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_intersect_assoc() ----------------------
begin ------------ array_uintersect_assoc() ---------------------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_uintersect_assoc($a, $b, "comp_func_cr"));
array(2) {
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_uintersect_assoc() ---------------------
begin ------------ array_intersect_uassoc() ---------------------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_intersect_uassoc($a, $b, "comp_func"));
array(4) {
  ["0.5"]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(12)
    ["public_member"]=>
    int(12)
  }
  [0]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(23)
    ["public_member"]=>
    int(23)
  }
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_intersect_uassoc() ---------------------
begin ------------ array_uintersect_uassoc() with ordinary func -
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_uintersect_uassoc($a, $b, "comp_func_cr", "comp_func"));
array(2) {
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_uintersect_uassoc() with ordinary func -
begin ------------ array_uintersect_uassoc() with method --------
$a=array (
  '0.1' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 12,
     'public_member' => 12,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 23,
     'public_member' => 23,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
$b=array (
  '0.2' => 
  cr::__set_state(array(
     'priv_member' => 9,
     'public_member' => 9,
  )),
  '0.5' => 
  cr::__set_state(array(
     'priv_member' => 22,
     'public_member' => 22,
  )),
  0 => 
  cr::__set_state(array(
     'priv_member' => 3,
     'public_member' => 3,
  )),
  1 => 
  cr::__set_state(array(
     'priv_member' => 4,
     'public_member' => 4,
  )),
  2 => 
  cr::__set_state(array(
     'priv_member' => -15,
     'public_member' => -15,
  )),
);
var_dump(array_uintersect_uassoc($a, $b, array("cr", "comp_func_cr"), "comp_func"));
array(2) {
  [1]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(4)
    ["public_member"]=>
    int(4)
  }
  [2]=>
  object(cr)#%d (2) {
    ["priv_member:private"]=>
    int(-15)
    ["public_member"]=>
    int(-15)
  }
}
end   ------------ array_uintersect_uassoc() with method --------
