2013-06-21 79 views
7

in_array函数可以比较对象吗?PHP in_array对象比较?

例如,我有一个对象数组,我想将它们明显地添加到另一个数组。是否有可能检查一个对象是否已经被添加,如下所示:

in_array($distinct, $object); 

或者还有其他方法吗?

+0

你对“独特”的定义是什么?如果“distinct”与引用相等是相反的,那么仅仅传入'true'作为第三个参数就可以了。 – Jon

+0

所以这将与数组中的对象一起工作? – gorgi93

+1

有关“工作”的一些定义。你需要提供更多的细节,头脑阅读很难。 – Jon

回答

11

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; 
    } 
} 
+0

它实际上工作... XD – gorgi93

+0

哈哈,什么? $ idem不是任何地方的变量,也不是$ obj?这是如何投票13次? –

+0

好点。我已经更新了修复'$ idem'错字的回复。 这个示例代码的假设是'$ obj'只是代表一个现有的变量,它需要唯一地添加到'$ unique_objects'数组中。 – ukliviu

9

可以使用严格的比较:

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); // 
0

如果“STRICT”是“FALSE”,则通过在字符串中转换elem来进行比较经济需求。因此,如果您重写__toString魔术函数,则应该可以比较对象元素。

1

我不知道是不是因为一个较新的PHP版本,而是在我的项目中,在Ubuntu 12.04上使用PHP 5.3.16,它工作。它在我的一系列物体中找到了针状物体。我也通过加载同一个类的不同对象进行了双重检查,并对照不包含该对象的数组内容进行了测试,结果确实返回了false。因此,in_array可以比较对象。

0

我想出了一个有点不同,我认为更强大的选项。

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)来替换它。

虽然我不知道大数据集上的性能。

0

有很多方法可以做到这一点,你可以看到。我只是想我会再添加一个。我不知道为什么,但是当处理对象数组时,我喜欢使用使用回调函数的数组函数。

如果你的对象有任何形式的标识符,他们应该,如果你想测试他们的重复这,下面的工作:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) { 
    return $uniqueObject->id == $object->id 
}); 

if (!$found) { 
    $uniqueObjects[] = $object; 
} 

$object是你要找的对象,而$uniqueObjects是您正在搜索的对象数组是否存在。只需在识别属性上匹配uniqueObject和object,如id