2017-10-16 88 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); 
相關問題