Browse Source
New array functions for doing intersection of arrays that are complementary
New array functions for doing intersection of arrays that are complementary
to array_*diff* family of functions. Namely array_uintersect(), array_uintersect_assoc(), array_intersect_uassoc() and array_uintersect_uassoc(). Test case is also included. #docs and news entry later.PEAR_1_4DEV
4 changed files with 804 additions and 27 deletions
-
258ext/standard/array.c
-
4ext/standard/basic_functions.c
-
4ext/standard/php_array.h
-
565ext/standard/tests/array/array_intersect_1.phpt
@ -0,0 +1,565 @@ |
|||
--TEST-- |
|||
Test of the *intersect* bunch of functions (both assoc and non-assoc) |
|||
--FILE-- |
|||
<?php |
|||
error_reporting(E_ALL); |
|||
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 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' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_intersect($a, $b); |
|||
array(0) { |
|||
} |
|||
end ------------ array_intersect() ---------------------------- |
|||
begin ------------ array_uintersect() --------------------------- |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_uintersect($a, $b, "comp_func_cr")); |
|||
array(3) { |
|||
["0.1"]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(9) |
|||
["public_member"]=> |
|||
int(9) |
|||
} |
|||
[1]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(4) |
|||
["public_member"]=> |
|||
int(4) |
|||
} |
|||
[2]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(-15) |
|||
["public_member"]=> |
|||
int(-15) |
|||
} |
|||
} |
|||
end ------------ array_uintersect() --------------------------- |
|||
begin ------------ array_intersect_assoc() ---------------------- |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_intersect_assoc($a, $b)); |
|||
array(0) { |
|||
} |
|||
end ------------ array_intersect_assoc() ---------------------- |
|||
begin ------------ array_uintersect_assoc() --------------------- |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_uintersect_assoc($a, $b, "comp_func_cr")); |
|||
array(2) { |
|||
[1]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(4) |
|||
["public_member"]=> |
|||
int(4) |
|||
} |
|||
[2]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(-15) |
|||
["public_member"]=> |
|||
int(-15) |
|||
} |
|||
} |
|||
end ------------ array_uintersect_assoc() --------------------- |
|||
begin ------------ array_intersect_uassoc() --------------------- |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_intersect_uassoc($a, $b, "comp_func")); |
|||
array(0) { |
|||
} |
|||
end ------------ array_intersect_uassoc() --------------------- |
|||
begin ------------ array_uintersect_uassoc() with ordinary func - |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_uintersect_uassoc($a, $b, "comp_func_cr", "comp_func")); |
|||
array(2) { |
|||
[1]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(4) |
|||
["public_member"]=> |
|||
int(4) |
|||
} |
|||
[2]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(-15) |
|||
["public_member"]=> |
|||
int(-15) |
|||
} |
|||
} |
|||
end ------------ array_uintersect_uassoc() with ordinary func - |
|||
begin ------------ array_uintersect_uassoc() with method -------- |
|||
$a=array ( |
|||
'0.1' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 12; |
|||
var $public_member = 12; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 23; |
|||
var $public_member = 23; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
$b=array ( |
|||
'0.2' => |
|||
class cr { |
|||
var $ = 9; |
|||
var $public_member = 9; |
|||
}, |
|||
'0.5' => |
|||
class cr { |
|||
var $ = 22; |
|||
var $public_member = 22; |
|||
}, |
|||
0 => |
|||
class cr { |
|||
var $ = 3; |
|||
var $public_member = 3; |
|||
}, |
|||
1 => |
|||
class cr { |
|||
var $ = 4; |
|||
var $public_member = 4; |
|||
}, |
|||
2 => |
|||
class cr { |
|||
var $ = -15; |
|||
var $public_member = -15; |
|||
}, |
|||
); |
|||
var_dump(array_uintersect_uassoc($a, $b, array("cr", "comp_func_cr"), "comp_func")); |
|||
array(2) { |
|||
[1]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(4) |
|||
["public_member"]=> |
|||
int(4) |
|||
} |
|||
[2]=> |
|||
object(cr)#%d (2) { |
|||
[""]=> |
|||
int(-15) |
|||
["public_member"]=> |
|||
int(-15) |
|||
} |
|||
} |
|||
end ------------ array_uintersect_uassoc() with method -------- |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue