2017-12-18 3 views
4

Es gibt zwei Arrays, die unter Daten sagt haben -
$ a = Array (a, b, d, c, e, a);
$ b = Array (a, a, d, e, c, a);Unset/entfernen Array-Elemente, die ein Paar bilden PHP

Ich möchte eine Instanz von Array-Werten als Paar entfernen, d. H. Es sollte in Array 'a' und Array 'b' Wenn Sie verstehen, möchte ich Elemente entfernen, die ein ähnliches Paar bilden.

Der Ausgang sollte schließlich wie sein - $a = [b]; $b = [a]; als diejenigen sind die einzigen Elemente, die links, die kein Paar macht.

ich versucht, mit array_diff, aber es wird mir nicht die erwartete Ausgabe -

$arr1 = array_diff($aArr, $bArr); 
$arr2 = array_diff($bArr, $aArr); 

print_r($arr1); 
print "<br>"; 
print_r($arr2); 

$res = count($arr1) + count($arr2); 
print $res; 

Dieser Code funktioniert prima, wenn der Eingang
Array (c, d, e)
Array (a , b, c)

Aber wird Null für die Eingabe geben als
Array (a, a, b, d, e, c, a)
Array (b, a, b, d, e, c , a)

Wie kann ich das erreichen? Danke.

+0

sind die Positionen absolut? Wie in, wenn $ a 10 Elemente hat, dann hat $ b auch 10 und das $ a [9] wird gegen $ b [9] geprüft? – Forbs

+0

@Forbs, yeah die Größe von a und b sind absolut .. $ a und $ b beide haben gleiche Anzahl von Elementen. –

+0

Das fühlt sich an wie eine Coding-Interview-Frage. lol – paulz

Antwort

3

Sie können array_filter und vorbei Referenz verwenden:

$a = ['a', 'b', 'd', 'c', 'e', 'a']; 
$b = ['a', 'a', 'd', 'e', 'c', 'a']; 

$a = array_filter($a, function ($element) use (&$b) { 
    if (($key = array_search($element, $b)) !== false) { 
     unset($b[$key]); 

     return false; 
    } 

    return true; 
}); 

Hier ist demo.

Mit array_filter können wir Array basierend auf Prädikatfunktion filtern (eine Funktion, die für Elemente true zurückgibt, die im Ergebnis behalten werden sollen, und andernfalls false). In unserem Fall verwendet diese Funktion $b, um zu bestimmen, ob ein Element $a beibehalten werden soll oder nicht. Wenn wir in Abschnitt $b durch Bezugnahme, können wir Paare auf dem Weg entfernen.

+0

@sevavieti, Ihr Code funktioniert wie ein Zauber, aber könnten Sie bitte auch eine Erklärung hinzufügen, was Sie tun? –

+0

@KumarAnand, ja, sicher kein Problem. Froh, dass ich Helfen kann. – sevavietl

0

Dies funktioniert mit Arrays unterschiedlicher Größe und ignoriert Wertepositionen.

$arr1 = removePairs($aArr, $bArr); 
$arr2 = removePairs($bArr, $aArr); 

print_r($arr1); 
print "<br>"; 
print_r($arr2); 

$res = count($arr1) + count($arr2); 
print $res; 

function removePairs($a, $b) 
{ 
    $r = array(); 

    foreach ($a as $index => $value) { 
     $found = array_search($value, $b); 

     if ($found !== false) { 
      $b[$found] .= '-'; 
     } else { 
      $r[] = $value; 
     } 
    } 

    return $r; 
} 
0

Sie können Schleife durch jedes Array wie diese

foreach ($a as $aItem){ 
    if(!in_array($aItem, $b)){ 
     $arr1[] = $aItem; 
    } 
} 
var_dump($arr1); 
+0

Leider funktioniert dies nicht aufgrund von doppelten Werten.Also (a, a, b, c) und (b, c, a, a) ergibt ein leeres Array mit Ihrer Funktion. – Forbs

0

ich das wissen beantwortet. Aber die akzeptierte Antwort ist langsamer als meine kompliziertere Lösung (wenn die Reihenfolge keine Rolle spielt).

$a = ['a', 'b', 'd', 'c', 'e', 'a']; 
$b = ['a', 'a', 'd', 'e', 'c', 'a']; 
$ha = $hb = []; 
foreach ($a as $v) $ha[$v]++; 
foreach ($b as $v) $hb[$v]++; 

foreach (range('a', 'z') as $l) { 
    if (empty($ha[$l])) continue; 
    if (empty($hb[$l])) continue; 
    if ($ha[$l] > $hb[$l]) { 
     $ha[$l] = $ha[$l] - $hb[$l]; 
     unset($hb[$l]); 
     continue; 
    } 
    $hb[$l] = $hb[$l] - $ha[$l]; 
    unset($ha[$l]); 
} 
$a = []; 
$b = []; 
foreach ($ha as $l => $n) $a = array_merge($a, array_fill(0, $n, $l)); 
foreach ($hb as $l => $n) $b = array_merge($b, array_fill(0, $n, $l)); 

var_dump([$a, $b]); 

Above-Code ist O (N) als die akzeptierte Antwort ist O (N^2). Wählen Sie also aus Einfachheit oder Geschwindigkeit.

Verwandte Themen