Php 数组_diff_uassoc的行为不清楚
首先,我需要提到的是,我翻阅了手册和php文档,但没有找到答案。以下是我使用的代码:Php 数组_diff_uassoc的行为不清楚,php,arrays,array-difference,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
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');
那么首先,为什么有些对(1:0或3:1)是重复的呢?这是否意味着函数忘记了它已经比较了这些项目?我原以为它会比较所有相等的值对,但我在输出中看不到它。我错过什么了吗
所以问题是:从比较的顺序来看,这个函数的确切行为是什么,为什么我会看到重复的?(我的PHP版本,如果有用的话:PHP版本5.3.6-13ubuntu3.6)
我真的很困惑,正在等待一些好的解释…从那以后
我只需要这些不在第二个数组中的元素($a[0])
你不能使用array\u diff($a,$b)代码>?它回来了
array(1) {
[0]=>
int(5)
}
否则,
声明:
如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数
据我所知,这意味着compare()
函数应该更像这样:
function compare($a, $b) {
echo("$a : $b<br/>");
if($a === $b) return 0;
else if ($a > $b) return 1;
else return -1;
}
函数比较($a,$b){
回声($a:$b
);
如果($a==$b)返回0;
否则如果($a>$b)返回1;
否则返回-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
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
我问这个问题,因为它超出了回答的范围。我想你错过了返回值部分
返回一个数组,该数组包含array1中任何其他数组中都不存在的所有项
数组键用于比较
文本中缺少的是,比较仅以关联方式进行。这意味着任何自动声明的或用户定义的数字键都被键入字符串而不是整数
所以
$one = array(a,b,c,'hot'=>d); // d has no match and will be returned as array and go to the function alone
$two = array(a,b,c,d,e,f); //
因为$one hot=>d与关联级别上的$two 0=>d不匹配,所以返回$one hot=>d
由于字符串和整数数据类型比较的PHP特性,用户定义的函数可以通过使用更强的比较操作(如==)来增强比较
这有助于在类型不明确的情况下“0”=>d和0=>d可能看起来很相似,但直到您在代码中这样说之后才会出现
幸运的是,PHP7中出现了类型暗示,使我们摆脱了这种奇怪的构造和不清楚的文档
我是从我的评论中添加这一点的,因为这涉及到您对在您的案例中最好使用哪些php结构的理解。我的评论是:
我不太确定,因为如果($a!=$b){在他们的代码中是a
问题。因为他们在应该平等的时候错误地使用了平等
使用相同的运算符!==。并且它们在
为关联键设计的构造。它们可能也是
不知道哪个数组更适合所涉及的数据
这确实有点吸引人。我查阅了Github上的最新PHP源码(它是用C++编写的,你可能知道),并试图弄清楚它。
快速搜索显示,有问题的函数在第4308行声明
PHP_FUNCTION(array_diff_uassoc)
{
php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);
}
这表明实际的工作是由php\u array\u diff
函数完成的,可以在第3938行的同一个文件中找到。粘贴到这里有点长,确切地说是265行,但是如果需要,可以查找它
这就是我放弃的地方。我在C语言方面没有任何经验,现在已经很晚了,我已经厌倦了尝试理解它。我想先做关键比较,因为它可能比比较值更有效,但这只是一个猜测。无论如何,他们这样做可能有一个很好的理由
所有这些都只是一个很长的介绍,说明,为什么首先要在compare
函数中放入echo
。数组
的目标是函数的输出。你不应该依赖解析器如何处理它。如果明天他们决定更改内部工作将C函数的值与ie进行比较,你会得到完全不同的结果
也许您可以使用这个用php编写的替换函数:
这样,您就可以依靠行为不改变,并且可以完全控制内部工作…您可能应该在比较函数中使用严格的比较!==not==在这种情况下,比较本身并不是什么大问题。我想知道为什么echo
在比较时打印这样的结果。以及echo
是在比较之前触发的,所以我认为它是否严格并不重要。编写此代码的目的是:我只希望这些元素不在第二个数组($a[0]),如果它们在第二个数组中,我希望这些元素具有相同的键(索引)……所以函数当然应该只返回$a[0]我还不清楚它是在比较数组索引还是其他什么。我认为它实际上并没有比较数组索引。即使我们使用array_diff_unasoc进行3个数组比较,传递给回调函数的参数也只有2个。我有两个数组:$array1=array(“a”=>“a”,“b”=>“b”,“c”=>“c”,“d”=>“d”);
$array2=数组(“x”=>“x”,“y”=>“y”,“z”=>“z”)它给了我这对:b-a
b-c
d-b
c-b
d-c
y-x
z-y
a-x
a-y
a-z
b-x
b-y
d-x
d-y
d-z
我不知道
PHP_FUNCTION(array_diff_uassoc)
{
php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);
}