El comportamiento de array_diff_uassoc no está claro

En primer lugar, debo mencionar que busqué en documentos manuales y php y no encontré una respuesta. Aquí hay un código que uso:

class chomik {

    public $state = 'normal';
    public $name = 'no name';

    public function __construct($name) {
        $this->name = $name;
    }

    public function __toString() {
        return $this->name . " - " . $this->state;
    }
}

function compare($a, $b) {
    echo("$a : $b<br/>");
    if($a != $b) {
        return 0;
    }
    else return 1;
}

$chomik = new chomik('a');
$a = array(5, $chomik, $chomik, $chomik);
$b = array($chomik, 'b', 'c', 'd');
array_diff_uassoc($a, $b, 'compare');

Lo que pensé, array_diff_uassoc comparará todos los valores de estas dos matrices y, si existen valores, ejecutará la comparación de claves. Y la salida de este código es:

1 : 0
3 : 1
2 : 1
3 : 2
1 : 0
3 : 1
2 : 1
3 : 2
3 : 3
3 : 2
2 : 3
1 : 3
0 : 3

Entonces, ¿por qué algunos pares (1: 0 o 3: 1) están duplicados? ¿Significa que la función olvidó que ya comparó estos elementos? Pensé que compararía todos los pares de igual por valor, pero no lo veo en la salida. ¿Me estoy perdiendo de algo

Entonces la pregunta es: ¿cuál es el comportamiento exacto de esta función en términos de orden de comparación y por qué veo estos duplicados? (mi versión de PHP, si me ayuda es: PHP Version 5.3.6-13ubuntu3.6)

Estoy realmente confundido, y esperando una buena explicación de ello ...

Respuestas a la pregunta(6)

Su respuesta a la pregunta