我似乎无法弄清楚 PHP 场景背后发生了什么魔法以及为什么array_unique无法检测到我的重复项。
在我的具体情况下,我有 2 个用户集合,我将它们合并为一个,然后只保留唯一的条目。为此,我将两个集合都转换为数组,array_merge()
然后基于参数应用array_unique(..., SORT_REGULAR)
,以便将它们作为对象进行比较而无需任何转换。我意识到比较对象是一个滑坡,但在这种情况下它比我想象的更奇怪。
合并之后但在唯一性检查之前我有这个状态:
如您所见,第 4 项和第 11 项是相同的用户实体(非严格比较和严格比较都同意这一点)。然而,array_unique()
由于某种原因,他们都留在了名单中:
如您所见,第 7-10 项已被检测并删除,但第 11 项没有。
这怎么可能?我在这里没有看到什么?
当前运行 PHP 7.4.5
代码来自使用 Symfony 4.4.7 和 Doctrine ORM 2.7.2 的项目(尽管我认为这应该是无关紧要的,如果对象在比较==
和===
比较中都是相等的)。
奖励积分的有趣事实 -array_unique
连续申请两次实际上会产生独特的结果:
头脑=吹
更新:throw new \RuntimeException()
我在我的方法中添加了User::__toString()
,以额外确保没有人正在转换为字符串。
请不要建议转换为字符串 - 这既不是我的问题的解决方案,也不是这个问题的内容。
有只小跳蛙
炎炎设计
牛魔王的故事