|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-10-21 21:16 UTC] jonjohnson1 at yandex dot com
Description:
------------
function value_compare_func($a, $b){
if ($a === 'n_3') {
return 0;
}
return 1;
}
$array1 = array("n_1", "n_2", "n_3", "n_4" );
$array2 = array("green");
$result = array_udiff($array1, $array2, "value_compare_func");
print_r($result);
The expected output is:
Array([0] => 'n_1', [1] => 'n_2' , [3] => 'n_4' )
But PHP outputs:
Array([1] => 'n_2' , [3] => 'n_4' )
Where is n_1?
Test script:
---------------
$array1 = array("n_1", "n_2", "n_3", "n_4" );
$array2 = array("green");
$result = array_udiff($array1, $array2, "value_compare_func");
print_r($result);
Expected result:
----------------
Array([0] => 'n_1', [1] => 'n_2' , [3] => 'n_4' )
Actual result:
--------------
Array([1] => 'n_2' , [3] => 'n_4' )
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2026 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 06 14:00:02 2026 UTC |
Test code ``` <?php $a = [1,2,3,4,5]; $b = [2,3,5]; echo '#1 '; $r = array_udiff($a, $b, function($x, $y) { return $x === $y ? 0 : -1; }); var_dump($r); echo '<br />'; echo '#2 '; $r = array_udiff($a, $b, function($x, $y) { return $x === $y ? 0 : 1; }); var_dump($r); echo '<br />'; echo '#3 '; $r = array_udiff($a, $b, function($x, $y) { return $x - $y; }); var_dump($r); echo '<br />'; echo '#4 '; $r = array_udiff($a, $b, function($x, $y) { return $y - $x; }); var_dump($r); echo '<br />'; echo '#5 '; $r = array_udiff($a, $b, function($x, $y) { return (int)!$x === $y; }); var_dump($r); ?> ``` Expected output: ``` #1 array(2) { [0]=> int(1) [3]=> int(4) } #2 array(2) { [0]=> int(1) [3]=> int(4) } #3 array(2) { [0]=> int(1) [3]=> int(4) } #4 array(2) { [0]=> int(1) [3]=> int(4) } #5 array(2) { [0]=> int(1) [3]=> int(4) } ``` Actual output ``` #1 array(2) { [0]=> int(1) [3]=> int(4) } #2 array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) } #3 array(2) { [0]=> int(1) [3]=> int(4) } #4 array(2) { [0]=> int(1) [3]=> int(4) } #5 array(0) { } ``` As we can see in cases #2 and #5 we got wrong result. PS: Why comparison function must return integer not boolean? It shouldn't make difference whether other element is bigger or smaller, just is it equal or not.Sorry, I made mistake in last example. It should be ``` echo '#5 '; $r = array_udiff($a, $b, function($x, $y) { return (int)!($x === $y); }); var_dump($r); ``` Actual result: ``` #5 array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) } ```