PHP 在对象数组中获得唯一性的更简单方法

PHP Easier way to get unique in array of objects

我一直在绞尽脑汁试图思考是否有更简单的方法来从数组中获取唯一对象,但找不到任何文档或确认任何存在的东西可以满足我的要求。

我有一个 API 返回以下内容:

Array
(
    [0] => stdClass Object
        (
            [Name] => Kory Kelly
            [PhoneNumber] => (555) 555-5555
            [EmailAddress] => kkelly@email.com
        )

    [1] => stdClass Object
        (
            [Name] => Kory Kelly
            [PhoneNumber] => (555) 555-5555
            [EmailAddress] => kkelly@email.com
        )

)

现在显然我不能使用 array_unique -- 因为它根据数组键检查实际值 -- 我构建了一个递归函数来分离对象,重建为数组并在重建期间手动进行检查浏览器

if ( $arr['Name'] === $passed_arr['Name']
    && $arr['PhoneNumber'] === $passed_arr['PhoneNumber']
    && $arr['EmailAddress'] === $passed_arr['EmailAddress'] )

这行得通..但似乎有点啰嗦。是否有内置/更有效的方法?我觉得我正在用我目前的方法重新发明轮子。

如果您不想检查数据类型,那么您可以使用带有标志 SORT_REGULARarray_unique() 用于唯一对象

$list = json_decode('[{
  "name": "Ahmed",
  "phone": "(555) 555-5555",
  "email" : "test@test.com"
},
{
  "name": "Ahmed",
  "phone": "(555) 555-5555",
  "email" : "test@test.com"
},
{
  "name": "Ahmed",
  "phone": "(555) 555-5555",
  "email" : "test1@test.com"
}
]');

$uniqueList = array_unique($list, SORT_REGULAR );

结果应该是

array(2) {
  [0]=>
  object(stdClass)#1047 (3) {
    ["name"]=>
    string(5) "Ahmed"
    ["phone"]=>
    string(14) "(555) 555-5555"
    ["email"]=>
    string(13) "test@test.com"
  }
  [2]=>
  object(stdClass)#1045 (3) {
    ["name"]=>
    string(5) "Ahmed"
    ["phone"]=>
    string(14) "(555) 555-5555"
    ["email"]=>
    string(14) "test1@test.com"
  }
}

希望有用

如果对象的JSON字符串作为key,也可以通过简单的foreach循环实现

$arr = [
  (object)['Name' => 'Kory Kelly', 'PhoneNumber' => '(555) 555-5555'],
  (object)['Name' => 'Kory Kelly', 'PhoneNumber' => '(555) 555-5555'],
  (object)['Name' => 'Kory Kelly', 'PhoneNumber' => '(555) 555-5555X'],  //different
];

foreach($arr as $key => $object){
  $arr[json_encode($object)] = $object;
  unset($arr[$key]);
}
$arr = array_values($arr);
var_dump($arr);

3v4l.org 亲自尝试。

与 array_unique($arr, SORT_REGULAR ) 相比,只有在对象比较中只考虑某些键时,这种方法才会变得有趣。