【发布时间】:2013-10-23 06:42:07
【问题描述】:
我正在尝试使用array_udiff() 计算两个对象数组的差异。我的对象结构很复杂,我不能依赖定量属性,因为两个数组中对象的那些属性可能具有相同的值,但它们存储为不同的实例(这是预期的行为)。
所以,这是我的问题:有没有办法使用参考检测来检测两个数组中的相同实例?
我尝试了什么?
我试过了:
<?php
header('Content-Type: text/plain; charset=utf-8');
$a = new stdClass;
$b = new stdClass;
$c = new stdClass;
$a->a = 123;
$b->b = 456;
$c->c = 789;
$x = [ $a, $c ];
$y = [ $b, $c ];
$func = function(stdClass &$a, stdClass &$b){
$replacer = time();
$buffer = $a;
$a = $replacer;
$result = $a === $b;
$a = $buffer;
return $result;
};
$diff = array_udiff($x, $y, $func);
print_r($diff);
?>
并得到不成功的结果,因为如果我尝试替换 $x 元素的值,php 将不会从 $y 中删除引用。
我有相同的输出:
$func = function(stdClass &$a, stdClass &$b){
return $a === $b;
};
为了
$func = function(stdClass &$a, stdClass &$b){
return $a == $b;
};
这是一个空数组。
有什么建议吗?
【问题讨论】:
-
$buffer = $a; ... $a = $buffer;==> $a 并没有真正改变,是吗?确定它被分配了$replacer,但随后它被重新分配回原来的值......并且$diff将只包含false -
@EliasVanOotegem
$diff实际上包含一个空数组。检查。另外,为什么===不提供true。 -
因为
$b是stdClass的一个实例,并且在重新分配该引用后将其与$a进行比较 int 对象!== ints -
@EliasVanOotegem 这个东西工作过一次here,所以我刚刚检查过了。
-
当然它在那里工作,但该代码是比较原语,而不是对象......有很大的不同。顺便说一句:我在回答中说过,不要使用
&运算符(无论如何都不需要对象)here's why,你可能想通读一遍
标签: php arrays reference array-difference