PHP:如何检查数组中的值是否重复并记录它们?
我有一个多维数组,它可以输出数据(这个数组由一个foreach循环填充到特定项上): 第一个键是特定项目的id,第二个级别的键没有意义/重要性,但是值是 如本例所示,值PHP:如何检查数组中的值是否重复并记录它们?,php,arrays,multidimensional-array,duplicates,Php,Arrays,Multidimensional Array,Duplicates,我有一个多维数组,它可以输出数据(这个数组由一个foreach循环填充到特定项上): 第一个键是特定项目的id,第二个级别的键没有意义/重要性,但是值是 如本例所示,值0在1和3中都存在,值2在3和9中都存在,只有1是唯一的。我想在这里实现的是检查多个项目中是否存在任何值(这里就是这种情况),并通过某种方式跟踪某些值的重复位置 我该怎么做呢?我尝试过实现多种解决方案,包括找到的解决方案,但无论我尝试了什么,它似乎并没有按照我希望的方式工作 非常感谢能够帮助我或为我指出正确方向的人。您可以这样做来
0
在1
和3
中都存在,值2
在3
和9
中都存在,只有1
是唯一的。我想在这里实现的是检查多个项目中是否存在任何值(这里就是这种情况),并通过某种方式跟踪某些值的重复位置
我该怎么做呢?我尝试过实现多种解决方案,包括找到的解决方案,但无论我尝试了什么,它似乎并没有按照我希望的方式工作
非常感谢能够帮助我或为我指出正确方向的人。您可以这样做来检测是否有重复项
$mergedValues = [];
foreach ($outerArray as $id => $innerArray) {
$mergedValues = array_merge($mergedValues, $innerArray);
}
$uniqueValues = array_unique($mergedValues);
if (sizeof($uniqueValues) != sizeof($mergedValues)) {
echo 'You have duplicates!', PHP_EOL;
echo 'These are duplicates: ', implode(', ', array_unique(array_diff_assoc($mergedValues, $uniqueValues))), PHP_EOL;
}
我喜欢Aron Cederholm的答案,但你可以选择的另一个可能为你提供大量信息的方法是制作一种反向关联数组,其中值变成键,反之亦然。以下是我的意思(基于Aron的初始循环): 这样做的好处是按值为您和数组建立索引,对于每个值,您可以看到原始数组的哪些索引包含该值(如果有意义的话)。然后,您可以检查有多少项包含您正在查找的值
count($valueMap[$value])
$valueMap[$value]中的项目为您提供了一个索引数组,可以在其中找到这些值,这就解决了您的“跟踪值”问题,对吗
缺点是现在使用的内存量增加了一倍。实际上,您需要的是将数组值作为参数传递 使用5.6中的php,可以使用传递数组
array_intersect(…array_值($array));
这将显示在整个数组中重复的值
最后,要得到单个元素相对于其他元素的唯一重复值:
$repeated=[];
foreach(数组值($array)作为$analysisted\u部分){
数组映射(函数($array\u-piece)使用($analyzed\u-part,&$repeated){
//跳过当前
如果($analysisted\u part!=$array\u piece){
$repeated[]=数组相交($analysisted\u part,$array\u part);
}
}美元阵列);
}
//这里有一个元素和另一个元素之间的所有重复
var_dump($重复);
//获取唯一的值
$unique_repeated=array_unique(array_merge(…$repeated));
变量转储($unique\u repeated);
…有一些方法可以跟踪某些值的重复位置。。。如果count(array_unique(array))$valueMap = [];
foreach ($outerArray as $id => $innerArray) {
foreach ($innerArray as $value) {
if (!isset($valueMap[$value])) $valueMap[$value] = [$id];
else $valueMap[$value][] = $id;
}
}
count($valueMap[$value])