检查两个数组是否具有相同的值(无论值顺序如何)
[2,5,3]
[5,2,3]
它们是相等的,因为它们具有相同的值,但顺序不同。
我可以在不使用 foreach()
循环和 in_array()
的情况下找到答案吗?我认为这不会有效率。
[2,5,3]
[5,2,3]
They are equal because they have the same values, but not in the same order.
Can I find that out without using a foreach()
loop with in_array()
? I don't think it would be efficient.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
迟到了这个聚会。我也有同样的问题,但不想分类,这是我知道会起作用的直接答案。我想出了这个简单的单线,它仅适用于独特值的数组:
它也比排序选项快约5倍。并不是要这两个都特别慢,所以我想说的更多是关于您的个人偏好,以及您认为更清楚的一种。就我个人而言,我宁愿不排序。
编辑:感谢Ray指出的事实,即这仅适用于具有唯一值的数组。
Coming to this party late. I had the same question but didn't want to sort, which was the immediate answer I knew would work. I came up with this simple one-liner which only works for arrays of unique values:
It's also about a factor of 5 faster than the sort option. Not that either is especially slow, so I would say it is more about your personal preferences and which one you think is more clear. Personally I would rather not sort.
Edit: Thanks Ray for pointing out the fact that this only works with arrays with unique values.
这对聚会有点晚,但希望它将有用:
如果您确定阵列都只包含字符串或仅包含整数,则
array_count_values($ a)== array_count_values($ b)< /代码>具有更好的时间复杂性。但是,User1844933的答案更为笼统。
This is a bit late to the party but in hopes that it will be useful:
If you are sure the arrays both only contain strings or both only contain integers, then
array_count_values($a) == array_count_values($b)
has better time complexity. However, user1844933's answer is more general.如果您不想对数组进行排序,而只想检查相等性而不管值顺序如何,请使用 http://php.net/manual/en/function.array-intersect.php 像这样:
If you don't want to sort arrays but just want to check equality regardless of value order use http://php.net/manual/en/function.array-intersect.php like so:
最好的方法是使用
array_diff
http:http:http:http:// php php .net/manual/en/function.array-diff.phpThe best way will be using
array_diff
http://php.net/manual/en/function.array-diff.php由于给定的答案中没有一个完全独立于键的工作与重复的值(例如
[1,1,2]
等于[1,2,2]
),我'我自己写的。此变体不适用于多维数组。它确实检查两个数组是否包含完全相同的值,无论它们的键和顺序如何,而不修改任何参数。
尽管问题询问的是无 foreach 变体,但我找不到任何无需循环即可满足我的要求的解决方案。此外,大多数其他使用的函数也在内部使用循环。
为什么它不修改
$either
?因为 PHP 中的值是写时复制的,所以只要这是它自己的函数而不是内联代码,一旦$either
参数被修改,数组就会被复制第一次。如果您想内联此代码,请先执行此操作:
As none of the given answers that are completely key-independent work with duplicated values (like
[1,1,2]
equals[1,2,2]
) I've written my own.This variant does not work with multi-dimensional arrays. It does check whether two arrays contain the exactly same values, regardless of their keys and order without modifying any of the arguments.
Although the question asked about a foreach-free variant, I couldn't find any solution that satisfied my requirements without a loop. Additionally most of the otherwise used functions use a loop internally too.
Why does it not modify
$either
? Because values in PHP are copy-on-write, so as long as this is its own function and not inline code the array is copied once the$either
argument is modified for the first time.If you want to inline this code do this before:
如何将数组转换为字符串,然后比较字符串。
How about converting the arrays to strings and then comparing the strings.
比方说,如果你有两个这样定义的数组:
那么你可以用这段代码来判断它们是否相等:
Say, if you have two arrays defined like this:
Then you can use this piece of code to judge whether they equal:
这是准确的解决方案
Here is the accurate solution
给定的答案包含各种怪癖,这些怪癖证明这不是一个简单的问题,并且定义“相同值”对您的域而言意味着什么很重要。我的解决方案需要以下设计目标:
评估解决方案的测试案例看起来像:
解决方案(主要是根据Seyfahni的答案进行的):
The given answers contain various quirks that prove this is not a straightforward problem and defining what "same values" means up-front for your domain is important. My solution for this required the following design goals:
The test case to evaluate solutions looks like:
And the solution (adapted primarily from seyfahni's answer):
我已经检查了这里的所有答案,并为大多数(如果不是全部)测试用例提出了统一的解决方案:
解决方案:
测试用例:
I have inspected all the answers here and came up with a uniform solution for most if not all test cases:
Solution:
Test Cases: