【发布时间】:2012-03-16 13:12:13
【问题描述】:
首先我需要提到的是,我深入研究了手册和 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');
我的想法是,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)
我真的很困惑,等待一些好的解释......
【问题讨论】:
-
您可能应该在比较函数中使用严格比较!== 而不是 ==。
-
在这种情况下,说实话,比较本身并不是什么大问题。我想知道为什么
echo在比较时会打印这样的结果。echo是在比较之前触发的,所以我认为它是否严格并不重要。 -
编写这段代码我想要实现的是:我只想要那些不在第二个数组($a[0])中的元素,如果它们在第二个数组中,我想要这些元素具有相同的键(索引)...所以当然函数应该只返回 $a[0]
-
我也很困惑是比较数组索引还是其他东西。我认为它实际上并没有比较数组索引。即使我们使用 array_diff_unassoc 进行了 3 个数组比较,传递给回调函数的参数也只有 2 个。
-
我有两个数组:
$array1 = array("a" => "a", "b" => "b", "c" => "c", "d" => "d");$array2 = array("x" => "x","y" => "y","z" => "z");,它给了我这对:b - ab - cd - bc - bd - cy - x98765343@332@98765343@33a - ya - zb - xb - yb - zc - xc - yc - zd - xd - xd - yd - z我不知道为什么这个函数比较数组。跨度>
标签: php arrays array-difference