我正在使用laravel
,我有两个集合数组,看起来像这样:
$collection1 = [
['id' => 1, 'name'=> 'phone', 'quantity' => 1, 'price' => 1200],
['id' => 2, 'name'=> 'tv', 'quantity' => 3, 'price' => 800],
];
$collection2 = [
['id' => 1, 'name'=> 'phone', 'quantity' => 1, 'price' => 1200],
['id' => 2, 'name'=> 'tv', 'quantity' => 3, 'price' => 400],
];
字符串
所以我需要知道它们是否相同,比较两个集合。如果在一些数组中,其中一个键(或几个)具有不同的值,那么它们将不再是相同的集合,例如在一个集合中,第二个项目的价格具有800的值,而另一个集合的价格为400。如何用PHP数组实现这一点?
6条答案
按热度按时间5f0d552i1#
laravel集合有一个叫做diff的方法,使用这个方法你可以获取集合中不存在于给定项目中的项目。项目是$collection2,它可以是一个数组或一个集合,所以你可以像这样在这两个集合之间获取不同的项目。
字符串
它返回一个Illuminate\Support\Escort类。你可以通过调用all()来获取这些项:
型
这段代码属于laravel docs. https://laravel.com/docs/7.x/collections#method-diff.在最后你可以把$differentItems转换为boolean.像这样:
型
更多链接https://laravel.com/api/7.x/Illuminate/Support/Collection.html#method_diff https://laravel.com/api/7.x/Illuminate/Support/Enumerable.html
2hh7jdfx2#
所以首先序列化每个元素,然后进行比较。
字符串
7hiiyaii3#
遵循比较函数:
字符串
还有一个测试:
型
0vvn1miw4#
据我所知,因为你的集合项是数组,所以没有简单的Laravel原生方法来做到这一点,你应该写一个函数来比较它们:
所以,假设,你有:
字符串
例如,您可以通过以下方式比较它们:
型
eiee3dmh5#
此方法仅在两个集合具有相同的键顺序时有效。
默认情况下,Laravel有一个diffAsk方法,它实际上是比较集合中的单个元素。如果你想比较两个集合数组,那么你必须创建自己的解决方案。
下面是我的解决方案,我创建(或者你可以说扩展)一个集合方法。
首先我Map每个元素并序列化,然后对另一个集合做同样的操作。通过使用diffAsynchronous方法获得差异并反序列化最终输出。
字符串
使用
型
请注意,这个新方法返回另一个集合(非零基)。并且它没有diffAsk所具有的“all()”方法。如果你想要一个零基索引数组,那么使用values函数沿着。
型
lc8prwob6#
我最后只是比较了
toJson()
的集合的输出,我不能说这在性能上有多差,但对我的情况(单元测试)来说还不错。