Php 是否基于对象属性从数组中删除重复项?
我有一个对象数组。我想根据对象中的“name”值删除重复项Php 是否基于对象属性从数组中删除重复项?,php,object,multidimensional-array,duplicate-removal,Php,Object,Multidimensional Array,Duplicate Removal,我有一个对象数组。我想根据对象中的“name”值删除重复项 [0]=> object(stdClass)#337 (9) { ["term_id"]=> string(2) "23" ["name"]=> string(12) "Assasination" ["slug"]=> string(12) "assasination" } [1]=> object(stdClass)#44 (9) {
[0]=>
object(stdClass)#337 (9) {
["term_id"]=>
string(2) "23"
["name"]=>
string(12) "Assasination"
["slug"]=>
string(12) "assasination"
}
[1]=>
object(stdClass)#44 (9) {
["term_id"]=>
string(2) "14"
["name"]=>
string(16) "Campaign Finance"
["slug"]=>
string(16) "campaign-finance"
}
[2]=>
object(stdClass)#298 (9) {
["term_id"]=>
string(2) "15"
["name"]=>
string(16) "Campaign Finance"
["slug"]=>
string(49) "campaign-finance-good-government-political-reform"
}
因此,在本例中,如何从数组中删除重复的“Campaign Finance”对象。那么整个[2]对象呢
我在这里讨论了一系列PHP重复数组的问题,但似乎没有一个能处理对象和仅根据一个参数进行过滤。使用现有键和仅将名称作为值构建一个新数组,使用
array\u unique
(注意它保留了键)
然后从原始密钥中删除所有不在唯一数组中的内容
编辑:完整示例:
class my_obj
{
public $term_id;
public $name;
public $slug;
public function __construct($i, $n, $s)
{
$this->term_id = $i;
$this->name = $n;
$this->slug = $s;
}
}
$objA = new my_obj(23, "Assasination", "assasination");
$objB = new my_obj(14, "Campaign Finance", "campaign-finance");
$objC = new my_obj(15, "Campaign Finance", "campaign-finance-good-government-political-reform");
$array = array($objA, $objB, $objC);
echo "Original array:\n";
print_r($array);
/** Answer Code begins here **/
// Build temporary array for array_unique
$tmp = array();
foreach($array as $k => $v)
$tmp[$k] = $v->name;
// Find duplicates in temporary array
$tmp = array_unique($tmp);
// Remove the duplicates from original array
foreach($array as $k => $v)
{
if (!array_key_exists($k, $tmp))
unset($array[$k]);
}
/** Answer Code ends here **/
echo "After removing duplicates\n";
print_r($array);
输出:
Original array:
Array
(
[0] => my_obj Object
(
[term_id] => 23
[name] => Assasination
[slug] => assasination
)
[1] => my_obj Object
(
[term_id] => 14
[name] => Campaign Finance
[slug] => campaign-finance
)
[2] => my_obj Object
(
[term_id] => 15
[name] => Campaign Finance
[slug] => campaign-finance-good-government-political-reform
)
)
After removing duplicates
Array
(
[0] => my_obj Object
(
[term_id] => 23
[name] => Assasination
[slug] => assasination
)
[1] => my_obj Object
(
[term_id] => 14
[name] => Campaign Finance
[slug] => campaign-finance
)
)
已删除具有术语\u id 15的对象,因为它与术语\u id 14同名。我正在搜索一个很好的答案,但找不到答案,因此我编写了自己的解决方案,用于处理此情况,以及基于多个属性进行重复数据消除时的情况
$array = DeDupeArrayOfObjectsByProps($array, ['name']);
以下是通用函数:
/**
* Iterates over the array of objects and looks for matching property values.
* If a match is found the later object is removed from the array, which is returned
* @param array $objects The objects to iterate over
* @param array $props Array of the properties to dedupe on.
* If more than one property is specified then all properties must match for it to be deduped.
* @return array
*/
public function DeDupeArrayOfObjectsByProps($objects, $props) {
if (empty($objects) || empty($props))
return $objects;
$results = array();
foreach ($objects as $object) {
$matched = false;
foreach ($results as $result) {
$matchs = 0;
foreach ($props as $prop) {
if ($object->$prop == $result->$prop)
$matchs++;
}
if ($matchs == count($props)) {
$matched = true;
break;
}
}
if (!$matched)
$results[] = $object;
}
return $results;
}
以下是您的案例的完整用法:
class my_obj {
public $term_id;
public $name;
public $slug;
public function __construct($i, $n, $s) {
$this->term_id = $i;
$this->name = $n;
$this->slug = $s;
}
}
$objA = new my_obj(23, "Assasination", "assasination");
$objB = new my_obj(14, "Campaign Finance", "campaign-finance");
$objC = new my_obj(15, "Campaign Finance", "campaign-finance-good-government-political-reform");
$array = array($objA, $objB, $objC);
$array = DeDupeArrayOfObjectsByProps($array, ['name']);
var_dump($array);
我需要同样的东西。。。
以下是我所做的工作(基于数组和对象)
稍微偏离主题,但密切相关:仅通过对象实例消除对象阵列重复数据的最短方法:
/**
* The array must NOT contain scalars.
*
* @param mixed[] $objects
* @return mixed[]
*/
public static function arrayUniqueForObjects(array $objects): array
{
$deDuplicatedArray = [];
foreach ($objects as $object) {
$deDuplicatedArray[spl_object_hash($object)] = $object;
}
return array_values($deDuplicatedArray);
}
一艘班轮:
$filtered=array\u intersect\u key($array,array\u unique(array\u column($array,'someProperty'));
请注意,array_column()在PHP7及更新版本中适用于对象数组。这很接近,但我也需要访问“slug”和“term_id”键。我正在四处玩,看看我是否能弄明白。你以后有权访问,只是为了找出要删除的键。稍后我将发布一个完整的示例。谢谢。对于我已经研究了几个小时的一个相当复杂的问题来说效果非常好。这应该是认可的解决方案。一个班轮永远是最好的!
/**
* The array must NOT contain scalars.
*
* @param mixed[] $objects
* @return mixed[]
*/
public static function arrayUniqueForObjects(array $objects): array
{
$deDuplicatedArray = [];
foreach ($objects as $object) {
$deDuplicatedArray[spl_object_hash($object)] = $object;
}
return array_values($deDuplicatedArray);
}