根据对象属性从数组中删除重复项?

Dre*_*ker 9 php object duplicate-removal multidimensional-array

我有一个对象数组.我想根据对象中的"name"值删除重复项.

  [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"
  }
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,如何从阵列中删除重复的"Campaign Finance"对象.整个[2]对象呢?

我在这里经历了一堆PHP重复数组问题,但似乎没有一个处理对象和过滤一个参数.

ccK*_*Kep 12

使用现有键和名称作为值构建一个新数组,使用array_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);
Run Code Online (Sandbox Code Playgroud)

输出:

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
        )

)
Run Code Online (Sandbox Code Playgroud)

删除了term_id 15的对象,因为它与term_id 14具有相同的名称.


小智 7

单线:

$filtered = array_intersect_key($array, array_unique(array_column($array, 'someProperty')));
Run Code Online (Sandbox Code Playgroud)

请注意,array_column() 适用于 PHP 7 及更新版本中的对象数组。