首先,我需要提及的是,我深入到手册和PHP文档,并没有找到答案。这里有一个代码,我使用:array_diff_uassoc的行为不明确
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');
我在想什么,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
所以首先为什么一些对(1:0或3:1)是重复的?这是否意味着功能忘了它已经比较了这些项目?我认为它会比较所有等值对,但我没有看到它的输出。我错过了什么吗?
所以问题是:根据比较的顺序,这个函数的确切行为是什么,为什么我看到这个重复? (我的PHP版本,如果它可以帮助是:PHP版本5.3.6-13ubuntu3.6)
我真的很困惑,并等待一些很好的解释...
你应该使用严格的比较!== not ==在比较函数中。 – 2012-02-27 00:27:34
在这种情况下,比较本身并不是一件大事。我想知道为什么'echo'在比较时打印这样的结果。并且'echo'在比较之前被触发,所以无论其严格与否都无所谓。 – Karol 2012-02-27 00:33:47
我想要实现的代码是:我只想要这些不在第二个数组中的元素($ a [0]),如果它们在第二个数组中,我希望这些元素具有相同的键(索引)...所以当然函数应该只返回$ a [0] – Karol 2012-03-06 01:18:06