in_array
函数可以比较对象吗?PHP in_array对象比较?
例如,我有一个对象数组,我想将它们明显地添加到另一个数组。是否有可能检查一个对象是否已经被添加,如下所示:
in_array($distinct, $object);
或者还有其他方法吗?
in_array
函数可以比较对象吗?PHP in_array对象比较?
例如,我有一个对象数组,我想将它们明显地添加到另一个数组。是否有可能检查一个对象是否已经被添加,如下所示:
in_array($distinct, $object);
或者还有其他方法吗?
的in_array功能无法比较的对象。
您应该从对象中创建唯一的键值对,只需要在将新对象插入到最终数组中时比较这些键。
假设每个对象具有唯一的id
属性,一个可能的解决办法是:
$unique_objects = array();
// $data represents your object collection
foreach ($data as $item) {
if (!array_key_exists($item->id, $unique_objects)) {
$unique_objects[$item->id] = $obj;
}
}
见http://php.net/manual/en/function.spl-object-hash.php
if (! array_key_exists(spl_object_hash($obj), $objects)) {
$objects[ spl_object_hash($obj) ] = $obj;
}
干杯
可以使用严格的比较:
in_array($object, $array, TRUE);
用例:
$a = new stdClass();
$a->x = 42;
$b = new stdClass();
$b->y = 42;
$c = new stdClass();
$c->x = 42;
$array = array($a,$b);
echo in_array($a, $array, true); // 1
echo in_array($b, $array, true); // 1
echo in_array($c, $array, true); //
如果“STRICT”是“FALSE”,则通过在字符串中转换elem来进行比较经济需求。因此,如果您重写__toString魔术函数,则应该可以比较对象元素。
我不知道是不是因为一个较新的PHP版本,而是在我的项目中,在Ubuntu 12.04上使用PHP 5.3.16,它工作。它在我的一系列物体中找到了针状物体。我也通过加载同一个类的不同对象进行了双重检查,并对照不包含该对象的数组内容进行了测试,结果确实返回了false。因此,in_array
可以比较对象。
我想出了一个有点不同,我认为更强大的选项。
function array_add_unique(&$array, $new, $test, $cb) {
if(is_array($array) && count($array)>0) {
for($i = 0; $i < count($array); $i++) {
if($array[$i][$test] == $new[$test]) {
$do = $cb($array[$i], $new);
if(is_bool($do) && $do) { $array[$i] = $new; }
else if(!is_bool($do)) { $array[$i] = $do; }
return;
}
}
}
array_push($array, $new);
}
这个解决方案的好处是它包括一个用户可定义的回调来处理冲突。在添加独特对象时,您可能希望保留旧对象和新对象的属性。
可以是匿名函数的回调接收新对象和现有对象,以便用户可以进行自定义计算。返回true只需替换现有的对象,或者返回一个新的对象(非bool)来替换它。
虽然我不知道大数据集上的性能。
有很多方法可以做到这一点,你可以看到。我只是想我会再添加一个。我不知道为什么,但是当处理对象数组时,我喜欢使用使用回调函数的数组函数。
如果你的对象有任何形式的标识符,他们应该,如果你想测试他们的重复这,下面的工作:
$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) {
return $uniqueObject->id == $object->id
});
if (!$found) {
$uniqueObjects[] = $object;
}
$object
是你要找的对象,而$uniqueObjects
是您正在搜索的对象数组是否存在。只需在识别属性上匹配uniqueObject和object,如id
。
你对“独特”的定义是什么?如果“distinct”与引用相等是相反的,那么仅仅传入'true'作为第三个参数就可以了。 – Jon
所以这将与数组中的对象一起工作? – gorgi93
有关“工作”的一些定义。你需要提供更多的细节,头脑阅读很难。 – Jon