【发布时间】:2015-06-07 21:46:59
【问题描述】:
我刚刚阅读了 that question 关于奇怪 php 行为的信息,尽管我可以进行更多研究,但我离理解它还差得很远。
我假设读者已经阅读了原始问题并且知道 OP 的代码块和示例,但简而言之,OP 正在尝试比较这两个数组,虽然结果很好,但比较函数似乎被不规律地调用:
$chomik = new chomik('a');
$a = array(5, $chomik, $chomik, $chomik);
$b = array($chomik, 'b', 'c', 'd');
array_diff_uassoc($a, $b, 'compare');
The documentation 有点晦涩......但它确实声明:
如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回一个小于、等于或大于零的整数。 p>
据我了解,这意味着compare() 函数应该更像这样:
function compare($a, $b) {
echo("$a : $b<br/>");
if($a === $b) return 0;
else if ($a > $b) return 1;
else return -1;
}
然而这仍然给出了非常奇怪的结果,甚至更多的“重复”
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面对很多疑惑,我read the compat php function,实际发生检查的部分很有趣:
foreach ($args[0] as $k => $v) {
for ($i = 1; $i < $array_count; $i++) {
foreach ($args[$i] as $kk => $vv) {
if ($v == $vv) { // compare keys only if value are the same
$compare = call_user_func_array($compare_func, array($k, $kk));
if ($compare == 0) {
continue 3; // value should not be added to the result
}
}
}
}
$result[$k] = $v;
}
here's the actual source(每个comment)
这段代码执行比较函数的方式不应该是输出我们看到的结果。 Foreach 无法在键中来回移动(AFAIK ???),这里的第一个键的顺序似乎就是这种情况:
1:2 3:1 2:1此外,如果值不匹配,它不应该检查键,那么为什么要检查所有这些:
1:2 3:1 2:1 3 : 2 等等...源码中最顶层的foreach()如何通过key来回循环?!
为什么仍然比较值不匹配的键?
即使是continued,foreach 循环是否真的会继续执行?
这是一个并发的例子吗?可以以某种方式启动 call_user_func_array 并实际执行比较函数的echo("$a : $b<br/>");,而不是按照它们“启动”的顺序??
【问题讨论】:
-
从自定义比较函数要求你返回-1来看; 0;或 1,它似乎在两个数组之间进行比较之前或同时进行排序。
-
我似乎无法理解它会在哪里这样做......