2016-08-04 7 views
0

Ich habe ein mehrdimensionales Array. Hier ist ein Beispiel mit nur zwei Aufzeichnungen, aber es könnte viel mehr sein:PHP - sicherstellen, dass bestimmte Werte in mehrdimensionalen Array sind einzigartig

array(2) { 
[0]=> array(7) 
{ 
[0]=> string(0) "" 
[1]=> string(0) "" 
[2]=> string(7) "4646468" 
[3]=> string(1) "1" 
[4]=> string(1) "2" 
[5]=> string(10) "2016-08-18" 
[6]=> string(0) "" 
} 
[1]=> array(7) 
{ 
[0]=> string(0) "" 
[1]=> string(0) "" 
[2]=> string(7) "4646469" 
[3]=> string(1) "1" 
[4]=> string(1) "2" 
[5]=> string(10) "2016-08-18" 
[6]=> string(0) "" 
} 
} 

ich dafür sorgen müssen, dass die Werte für die Tasten 0, 1 und 2 von jedem inneren Datensatz eindeutig sind. Wenn dies nicht der Fall ist, möchte ich diesen Datensatz (wie in diesem Array-Element mit seinen 7 Werten) aus dem Array entfernen (leere Strings sollten jedoch ignoriert werden). Ich habe this answer to a similar question gefunden, die erfolgreich Duplikate für mich ausgibt, aber ich möchte sie auch aus dem Haupt-Array entfernen. Das Problem ist, dass ich diesen Code überhaupt nicht verstehe. Ich glaube nicht, Rückrufe verstehen und daher nicht wissen, wie Sie diesen Code zu ändern, um zu erreichen, was ich brauche:

$unique = array(); 
foreach($checked as $v) { 
    $key = $v[0] . $v[1] . $v[2]; 
    if (!isset($unique[$key])) 
     $unique[$key] = 0; 
    else 
     $unique[$key]++; 
} 
print_r(array_filter($unique)); 

Antwort

0

Dies ist, was ich am Ende setzte sich auf:

//make sure either serial, asset tag or hostname have been filled in 
foreach($laptops as $num => $laptop){ 
    if (empty($laptop[0]) && empty ($laptop[1]) && empty($laptop[2])){ 
    $dont_insert[] = $laptop; 
    } else { 
    $do_insert[$num] = $laptop; 
    if($laptop[0]){$hostnames[$num] = $laptop[0];} 
    if($laptop[1]){$asset_tags[$num] = $laptop[1];} 
    if($laptop[2]){$serials[$num] = $laptop[2];} 
    } 
} 
//check user hasn't entered the asset tag, serial or hostname more than once 
if (count(array_unique($hostnames)) < count($hostnames)) { 
    //there are duplicate hostnames 
    $counts = array_count_values($hostnames); 
    $filtered = array_filter($counts, function($value) { 
     return $value != 1; 
    }); 
    $result = array_keys(array_intersect($hostnames, array_keys($filtered))); 
    foreach($result as $dupe){ 
    $dupes[$dupe] = $do_insert[$dupe]; 
    } 
} 
if (count(array_unique($asset_tags)) < count($asset_tags)) { 
    //there are duplicate asset tags 
    $counts = array_count_values($asset_tags); 
    $filtered = array_filter($counts, function($value) { 
     return $value != 1; 
    }); 
    $result = array_keys(array_intersect($asset_tags, array_keys($filtered))); 
    foreach($result as $dupe){ 
    $dupes[$dupe] = $do_insert[$dupe]; 
    } 
} 
if (count(array_unique($serials)) < count($serials)) { 
    //there are duplicate serials 
    $counts = array_count_values($serials); 
    $filtered = array_filter($counts, function($value) { 
     return $value != 1; 
    }); 
    $result = array_keys(array_intersect($serials, array_keys($filtered))); 
    foreach($result as $dupe){ 
    $dupes[$dupe] = $do_insert[$dupe]; 
    } 
} 
//remove any duplicates from our insertion array 
if(count($dupes)){ 
    foreach($dupes as $num => $dupe){ 
    unset($do_insert[$num]); 
    } 
} 
0

Sie dies tun können, den ursprünglichen Code zu modifizieren Snippet Sie fügte hinzu:

//$main_array contains your original array data. 

$unique = array(); 

foreach($main_array as $key=>$value) { 
    $key_combination = $value[0] . '-' . $value[1] . '-'. $value[2]; 
    //add the key combination to array if it doesn't initially exists 
    if (!isset($unique[$key_combination])){ 
     $unique[$key_combination] = 0; 
     } 
    //if it gets to this condition means this key combination is a 
    //duplicate and we need to remove the element from main_array 
    else{ 
     unset($main_array[$key]); 
     } 
} 

print_r($main_array);//should contain your original array with duplicates removed 

versuchen wir uns diese Route

$unique = array(); 
foreach($main_array as $key=>$value) { 
    $key_combination = $value[0] . '-'. $value[1] . '-'. $value[2]; 
    //add the key combination to array if it doesn't initially exists 
    if (!in_array($key_combination, $unique)){ //This is the change 
     $unique[] = $key_combination;// track duplicates by storing in array 
     } 
    //if it gets to this condition means this key combination is a 
    //duplicate and we need to remove the element from main_array 
    else{ 
     unset($main_array[$key]); 
     } 
} 
+0

Dank dafür - ich habe beginnen den ursprünglichen Code auf diese Weise verwenden und es funktioniert, außer, aus irgendeinem Grund, es funktioniert nicht, wenn mehr als eines der drei Felder wurde ausgefüllt. Mit anderen Worten, wenn _only_ key [0] Daten enthält, die mit einem anderen Datensatz übereinstimmen, wird dieser gefunden. Wenn jedoch die Tasten 1 und 2 ebenfalls Daten enthalten, funktioniert der Code nicht. – daninthemix

+0

Sind die Werte in den Schlüsseln enthalten, die von Benutzereingaben geliefert werden, und sind die Eingaben bereinigt? Versuchen Sie dies für die Schlüsselkombination. $ key = trimmen ($ v [0]). trimmen ($ v [1]). trimmen ([$ v [1]) –

+0

Hilft nicht, ich habe Angst. Es wird eine Übereinstimmung über jedes der drei Felder finden, aber nur dann, wenn dieses eine übereinstimmende Feld das einzige vorhandene Feld der drei Felder ist. – daninthemix

0

Wenn Sie durch ein Array zu durchlaufen möchten, und überprüfen für eindeutige Werte in „Tasten 0, 1 und 2“, jede dieser Tasten Behandlung separat in Bezug auf die Einzigartigkeit, dann würde ich definieren wahrscheinlich drei Arrays (Hashes), eine für jede der drei, und dann so etwas tun:

$exists0 = array(); $exists1 = array(); $exists2 = array); 
... 
foreach ($array as $record) { 
    if (array_key_exists($exists0, $record[0]) ... you have a duplicate. 
    $exists0[$record[0]] = true; // any value will do ... 

    if (array_key_exists($exists1, $record[1]) ... etcetera. 
} 

Die Präsenz eines Schlüssels in jedem Die Hashwerte $exists0, $exists1, $exists2 zeigen an, dass der Wert ein Duplikat ist. (Der mit dem Schlüssel verbundene Wert ... true ist in diesem Fall ... irrelevant.)

In meinem Beispiel werden drei Hashes verwendet, da ich davon ausgehe, dass Sie die drei Felder getrennt behandeln möchten. Wenn Sie auf Duplikate in irgendwelcher der drei testen möchten, ist die Änderung zu meinem Beispiel trivial und offensichtlich.