2016-05-04 7 views
0

Ich habe folgendes mehrdimensionales Array:Suche ein mehrdimensionales Array nach Duplikaten und das Rück doppelte Werte und Array-Schlüssel

$ancestors = array(
[1] =>array("Andrew","Adele"), 
[2] =>array("Bertha","Bill","Billy","Blake"), 
[3] =>array("Cathy","Case","Cory","Creek","Andrew","Ceaser","Cece","Childer")); 

Ich versuche, um die Zeilen zu suchen und doppelte Werte zurückkehren zusammen mit dem Array-Schlüssel von der niedrigsten Nummer das Duplikat wird und Werte zu einem assoziativen Array zurück:

$common = array("Andrew"=>"1"); 
+0

Kann es innerhalb desselben Sub-Arrays Duplikate geben? –

+0

Wo ist dein Code? –

+0

Es sollte keine Duplikate in den Sub-Arrays geben. Ich habe verschiedene Methoden versucht, dies zu kodieren, aber ich kann nichts finden, was funktioniert. Ich habe verschachtelte foreach-Anweisungen versucht, aber ich habe versagt. –

Antwort

0
// merge all array in one 
$new = array(); 
foreach($ancestors as $i) 
    $new = array_merge($new, $i); 

// make array value => count and sort in in descendant order 
$ar = array_count_values($new); 
arsort($ar); 

// save result array while count > 1 
$result = array(); 
foreach($ar as $k => $v) { 
    if ($v < 2) break; 
    $result[$k] = array_search($k, $new) + 1; 
} 

print_r($result); 
0

Zuerst alle Namen kombinieren sich zu einem Array, mit Namen als Schlüssel und Anordnungen von Generation Indizes als Werte:

foreach ($ancestors as $generation_key => $generation) { 
    foreach ($generation as $name) { 
     $combined[$name][] = $generation_key; 
    } 
} 

dann die kombinierten Ergebnisse auf Werte begrenzen, mehr als eine Instanz des Namens mit:

$duplicates = array_filter($combined, function($x) { return count($x) > 1; }); 

Dann wandeln die Arrays Einzelwerte unter Verwendung von min:

foreach ($duplicates as &$value) { 
    $value = min($value); 
} 
unset($value); 
0

Wir müssen jede Zeile mit folgenden Zeilen vergleichen, also Zeile 1 mit 2 und 3, Zeile 2 mit 3, Zeile 3 mit nichts (es wird bereits verglichen). Um dies zu tun, verwenden wir eine Basis-1 for eine Schleife durch alle $ancestors Elemente mit Ausnahme zuletzt, dann vergleichen wir jeden Namen mit mehr Vorfahren:

$result = array(); 
/* Loop count($ancestors) -1: */ 
for($i = 1; $i<count($ancestors); $i++) 
{ 
    /* Loop for each name: */ 
    foreach(current($ancestors) as $val) 
    { 
     /* If name is already in result, skip: */ 
     if(isset($result[$val])) continue; 
     /* Loop for each following ancestors: */ 
     foreach(array_slice($ancestors, $i, Null, True) as $key => $row) 
     { 
      if(in_array($val, $row)) $result[ $val ] = key($ancestors); 
     } 
    } 
    next($ancestors); 
} 

Für diese $ancestors:

$ancestors = array(
    1 =>array("Andrew","Adele"), 
    2 =>array("Bertha","Bill","Billy","Blake","Adele"), 
    3 =>array("Cathy","Case","Cory","Creek","Andrew","Ceaser","Bill","Cece","Childer"), 
    4 =>array("Cathy") 
); 

das Ergebnis ist:

Array 
(
    [Andrew] => 1 
    [Adele] => 1 
    [Bill] => 2 
    [Cathy] => 3 
) 
Verwandte Themen