我的目标是在对象数组中找到重复项,但仅限于特定的对象变量。
我没有像以下那样使用两个foreach循环,而是在寻找更好(更优雅)的方法来找到重复项:
foreach ($data as $date) {
foreach ($data as $innerDate) {
if ($date->birthday == $innerDate->birthday &&
$date->street == $innerDate->street &&
$date->streetnr == $innerDate->streetnr &&
$date->zipcode == $innerDate->zipcode &&
$date->twinid == $innerDate->twinid &&
$date !== $innerDate) {
// Duple
}
}
}
谢谢!
现在,我正在使用以下代码,基于Tarilo的想法:
usort($data, function($obj_a, $obj_b){
if ($obj_a->birthday == $obj_b->birthday &&
$obj_a->street == $obj_b->street &&
$obj_a->streetnr == $obj_b->streetnr &&
$obj_a->zipcode == $obj_b->zipcode &&
$obj_a->twinid == $obj_b->twinid) {
// Duple
}
});
看起来好于两个foreach-Loops; - )
答案 0 :(得分:3)
答案 1 :(得分:2)
您可以先对数组进行排序,然后遍历已排序的数组。这样,您只需要将当前对象与下一个/上一个对象进行比较。您当前的算法效率为O(n ^ 2),但在排序后它将(排序+循环)=(O(log n)+ O(n))有效。其中n是数组中对象的数量。
答案 2 :(得分:0)
由于$ data是一个数组,我们可以使用array_ * function
试试这个,适用于我的目的(PHP 5.2.0)。
if ($data != array_unique($data)) {
echo 'oops, this variable has one or more duplicate item(s)'; die;
}
答案 3 :(得分:0)
这个给你一个包含类似项目的数组。对于更大的数据集应该更快:O(2n),字符串连续的额外成本和计数结果组。由于hashmap,只需要多一点内存。
$hashmap = array();
foreach ($data as $date) {
$hash = $date->zipcode.'-'.$date->street.'-'.$date->streetnr.'-'.$date->birthday.'-'.$date->twinid;
if (!array_key_exists($hash, $hashmap)) {
$hashmap[$hash] = array();
}
$hashmap[$hash][] = $date;
}
foreach ($hashmap as $entry) {
if (count($entry) > 1) {
foreach ($entry as $date) {
// $date is a duplicate
}
}
}