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)
我真的很困惑,等待一些很好的解释......
我只想要第二个数组中没有的元素 ($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
我就此提出了另一个问题,因为它超出了答案的范围。
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |