数组交叉为对象数组php

zah*_*in 11 php arrays object

我想知道如何为对象数组array_intersect.

Mat*_*wak 11

您可以将array_uintersect与spl_object_hash结合使用,请参阅示例:

    array_uintersect($a, $b, function($a, $b) {
        return strcmp(spl_object_hash($a), spl_object_hash($b));
    });
Run Code Online (Sandbox Code Playgroud)

其中'$ a'和'$ b'是您想要交叉的一些对象的数组.

  • 不错的解决方案。对于当代读者:在 php7 中,`strcmp()` 可以替换为 `<=>` 运算符,如下所示:`return spl_object_hash($a) <=> spl_object_hash($b);` (3认同)

小智 6

好的toString函数已经实现并被称为serialize;)所以

array_map(
    'unserialize',
    array_intersect(
        array_map(
            'serialize',
            $obj1
        ), 
        array_map(
            'serialize', 
            $obj2
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

将做的工作,提到更高的例子不起作用'因为array_intersect工作只有字符串,如同有人提到的那样


Svi*_*ack 2

array_intersect()返回一个数组,其中包含所有参数中存在的 array1 的所有值。

那么在这个上下文中存在什么意思(确切地说是这个函数),我在 php.net 上找到了我的答案:

当且仅当 (string) $elem1 === (string) $elem2 时,两个元素才被视为相等。换句话说:当字符串表示相同时。

如果您的对象没有实现到字符串的唯一转换,则您不能在对象数组上使用它。

  • 这是不准确的。至少有三种方法可以将对象转换为字符串。它们可能是一个 PHP 类并实现 __toString,它们可能有一个接受 IS_STRING 的转换处理程序,并且它们可能有一个返回可转换为字符串的 zval 的 get 处理程序。 (4认同)