array_diff_uassoc的行为不清楚

Kar*_*rol 5 php arrays array-difference

首先,我需要提一下,我深入研究手册和php文档并没有找到答案.这是我使用的代码:

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');
Run Code Online (Sandbox Code Playgroud)

我的想法是,array_diff_uassoc会比较这两个数组的所有值,如果值存在,那么将运行密钥比较.这段代码的输出是:

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
Run Code Online (Sandbox Code Playgroud)

首先,为什么有些对(1:0或3:1)是重复的?这是否意味着功能忘记它已经比较了这些项目?我认为它将比较所有相等的值对,但我没有在输出中看到它.我错过了什么吗?

所以问题是:这个函数在比较顺序方面的确切行为是什么,为什么我看到这个重复?(我的PHP版本,如果它的帮助是:PHP版本5.3.6-13ubuntu3.6)

我真的很困惑,等待一些很好的解释......

Fél*_*ier 0

OP的 评论来看

我只想要第二个数组中没有的元素 ($a[0])

你不能用吗array_diff($a, $b);?它返回

array(1) {
  [0]=>
  int(5)
}
Run Code Online (Sandbox Code Playgroud)

否则,

该文档指出:

如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数。

据我了解,这意味着该compare()函数应该更像是这样的:

function compare($a, $b) {
    echo("$a : $b<br/>");
    if($a === $b) return 0;
    else if ($a > $b) return 1;
    else return -1;
}
Run Code Online (Sandbox Code Playgroud)

然而,即使进行了这种修正,它的比较结果仍然非常奇怪:

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

我就此提出了另一个问题,因为它超出了答案的范围。