2017-10-16 5 views
1

Ich habe ein mehrdimensionales Array, die Daten als solche Ausgänge (dies mit einem foreach Schleifen über bestimmte Elemente gefüllt wird):PHP: Wie überprüfe ich, ob doppelte Werte im Array vorhanden sind und zeichne sie auf?

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

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

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

die ersten Tasten sind IDs von bestimmten Elementen, die Tasten auf der zweiten Ebene von NO Bedeutung/Wichtigkeit, aber die Werte sind.

Wie Sie in diesem Beispiel sehen können, besteht der Wert 0 sowohl in 1 und 3 und der Wert 2 existst sowohl in 3 und 9 und nur 1 ist einzigartig. Was ich hier erreichen möchte, ist zu überprüfen, ob ein Wert in mehreren Elementen vorhanden ist (wie hier der Fall), und eine Möglichkeit zu haben, zu verfolgen, wo bestimmte Werte dupliziert werden.

Wie würde ich das machen? Ich habe versucht, mehrere Lösungen zu implementieren, einschließlich der gefundenen here, aber was auch immer ich versuche, es scheint nicht ganz so zu funktionieren, wie ich es gerne hätte.

Vielen Dank an alle, die mir helfen oder mir in die richtige Richtung zeigen können.

+0

_... eine Möglichkeit haben Spur zu halten wo bestimmte Werte dupliziert werden ..._ Wenn count (array_unique (array))

+0

In welcher Weise willst du das verfolgen? –

Antwort

1

Sie können dies tun, um zu erkennen, wenn Sie Duplikate

$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

Ich mag Aron Cederholm Antwort, aber eine andere Option, die Sie für Sie gehen könnte, die Sie mit vielen Informationen zur Verfügung stellen könnte, ist eine Art umgekehrt zu machen Assoziatives Array, bei dem die Werte zu Schlüsseln werden und umgekehrt. Hier ist, was ich meine (basierend auf Arons anfänglichen Schleife):

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

Dies hat den Vorteil, von Wert indiziert Sie und Array geben, und für jeden Wert können Sie sehen, welche Indizes des ursprünglichen Arrays diesen Wert enthalten, wenn Das macht Sinn. Anschließend können Sie überprüfen, wie viele Elemente enthalten den Wert Sie suchen mit

count($valueMap[$value]) 

und das Element bei $ valueMap [$ value] gibt Ihnen eine Reihe von Indizes, wo diese Werte gefunden werden können, die Ihre Antworten " Verfolgen Sie die Werte "Problem, richtig?

Der Nachteil ist, dass Sie jetzt die Menge an Speicher verdoppelt haben.

0

Was Sie suchen, ist in der Tat array_intersect und übergeben Sie die Array-Werte als Parameter.

Mit PHP von 5.6 können Sie das Array unter Verwendung variadic functions übergeben.

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

Dadurch werden Ihnen die Werte zeigen, die alle über das Array wiederholt werden (Sie können es: https://eval.in/880808)

Und am Ende den einzigartigen wiederholten Wert über das einzelne Element gegen die bekommen andere:

Sie können es auf: 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); 
Verwandte Themen