如何判断相同元素不同顺序组成的不同数组是相同的?

比如要根据传递的数组,如果里面的元素相同(顺序可能不同),转为字符串作为redis 的 key

$a=['a','b','c'];
$b=['b','a','c'];
$c=['c','b','a'];
$d=['c','b','a','d'];
function test($arr){
   // do sth
   $tmp = doSth($arr);
   $redis->set(implode(',',$tmp),time());
}
function doSth($arr){
    sort($arr);//暂时可以解决
    return $arr;
}
//$a,$b,$c都是 a b c 组成的,就可以把他们当做一个 key 也就是 doSth($a) doSth($b) doSth($c) 返回值相同,$d返回不同
阅读 5k
7 个回答

楼上其实有人已经回答到点子上了,用array_intersect取交集,
其实就是个相似度计算的问题 ,昨天我写了个文章,讲的是利用文章Tag推荐相似文章,就用到这了个方法,
jaccard相似度

给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:

bVbgVBi?w=252&h=38

你这里只要相似度为1 就证明两个数组里的元素是完全相同的

创建一个集合set 遍历每一个数组,向set集合添加,得到的就是结果

a=['a','b','c']
b=['b','a','c']
c=['c','b','a']
d=['c','b','a','d']

ret = list(set(a).intersection(set(b)))

key去做排序,这里为什么要说key呢,这个key代表你认为他们相同的条件,别用name去排序,比较的时候用value

当然上面的方法不骚。两个排序,加一个遍历比较。

骚一点的。遍历其中一个。放入对象里面,组成key:true的形式。然后遍历另一个。判断在存在不。等于遍历两次。

function doSth($arr){
    sort($arr);//暂时解决
    return $arr;
}

如果资源充足,则分别排序后依次比较即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏