2015-03-04 2 views
1

Продолжим. Почему array_udiff сравнивает значения первого массива после sorting?Попытка понять поведение array_udiff

$compare = function($a, $b) use(&$iteration_count) 
    { 
    echo("$a : $b\n"); 
    $iteration_count++; 
    return strcmp($a, $b); 
    }; 

$a = array('a', 'b', 'c'); 
$b = array('x', 'y', 'z'); 


$iteration_count = 0; 
echo "array_udiff:" . json_encode(array_udiff($a, $b, $compare)) . "\n"; 
echo "iterations: $iteration_count\n\n"; 

Выходной

b : a // sorting $a started 
c : b 
y : x // sorting $b started 
z : y 
a : x // comparison started 
a : b //     -- what for? 
b : x 
b : c //     -- what for? 
c : x 
array_udiff:["a","b","c"] 
iterations: 9 

http://3v4l.org/3Me8o#v500

+0

... чтобы найти фактические матчи? Как и с вашим вопросом uassoc? – bwoebi

+0

@bwoebi, уже известно, что 'b'> 'a', потому что $ a уже отсортирован. Я не вижу плюсов из этого повторного сравнения. – sectus

+0

О, извините, я здесь не уделял достаточного внимания ... – bwoebi

ответ

2

После сравнения A[0] и B[0] он будет пропускать все значения в A, что равное A[0], потому что B не имеет такого значения; см. here.

Для этого необходимо сравнить не менее A[1] с номером A[0]; Вы можете наблюдать такое поведение, сделав небольшое изменение в первом массиве:

$a = array('a', 'a', 'b', 'c'); 

Выход:

... 
a : x 
a : a <-- * 
a : b 
b : x 
b : c 
c : x 
Смежные вопросы