2017-10-16 48 views
1

我有一个多维阵列,其输出数据本身(这获取填充有一个foreach遍历特定项目):PHP:如何检查数组中的重复值并保存它们的记录?

Array 
(
[1] => Array 
    (
     [0] => 0 
    ) 

[3] => Array 
    (
     [0] => 0 
     [1] => 1 
     [2] => 2 
    ) 

[9] => Array 
    (
     [0] => 2 
    ) 
) 

第一密钥是特定项的ID,在第二级上的键是不意义/重要性,然而值是。

正如你可以看到在这个例子中,价值0都存在于13,和值2 existst两个39只有1是独一无二的。我想在这里实现的是检查多个项目中是否存在任何值(如此处所示),并且有某种方式可以跟踪某些值的重复位置。

我该怎么做呢?我尝试过实施多种解决方案,其中包括发现here的解决方案,但无论我尝试什么,它都不像我希望的那样工作。

非常感谢任何能够帮助我或指引我走向正确方向的人。

+0

_...有跟踪的一些方法某些值重复的地方...如果count(array_unique(array))

+0

你想以什么方式跟踪这个? –

回答

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; 
} 
0

我喜欢阿隆Cederholm的答案,但另一种选择,你可以去,你可能会为你提供大量的信息是做出一种逆向的关联数组,其中值成为键,反之亦然。这就是我的意思是(基于阿隆最初的环):

$valueMap = []; 
foreach ($outerArray as $id => $innerArray) { 
    foreach ($innerArray as $value) { 
     if (!isset($valueMap[$value])) $valueMap[$value] = [$id]; 
     else $valueMap[$value][] = $id; 
    } 
} 

这有让您和数组由值索引的好处,并为每一个值,你可以看到它的原始数组的索引包含的值,如果这就说得通了。然后,您可以检查多少项目包含你正在寻找的价值与

count($valueMap[$value]) 

而在$ valueMap [$值]给你指数的数组,其中的值可以发现该项目,回答你的“跟踪价值“问题,对吧?

缺点是你现在使用的内存数量增加了一倍。

0

您要查找的内容实际上是array_intersect并传递数组值作为参数。

使用PHP从5.6你可以通过使用variadic functions阵列。

array_intersect(...array_values($array)); 

这将显示正在重复所有阵列上的值(你可以检查一下:https://eval.in/880808

而最终在对单个元素,以获得独特的重复值其他:

您可以检查它:https://eval.in/880864

$repeated = []; 
foreach (array_values($array) as $analyzed_part) { 
    array_map(function ($array_piece) use ($analyzed_part, &$repeated) { 
    // Skip the current 
    if ($analyzed_part != $array_piece) { 
     $repeated[] = array_intersect($analyzed_part, $array_piece); 
    } 
    }, $array); 
} 

// Here you have all the repetitions between one element and the other 
var_dump($repeated); 

// Get the unique values 
$unique_repeated = array_unique(array_merge(...$repeated)); 
var_dump($unique_repeated); 
相关问题