2016-08-11 4 views
3

Ich verwende den folgenden Code, um den Unterschied von zwei Arrays zu erhalten. Aber wie es jetzt scheint, entfernt es zu viele Elemente oder ich mache etwas falsch.array_diff() entfernt zu viele Elemente

Ich erwarte die Ausgabe array(333, 111), weil das Element 111 zweimal im ersten Array und nur einmal in der zweiten Zeile angezeigt wird. Also 1x 111 sollte in der Ausgabe sein. Aber im Moment fehlt 111 vollständig in der Ausgabe.

Mache ich etwas falsch oder was soll ich tun, damit diese Funktion so funktioniert, wie ich will?

<?php 

    $Inventory1 = "111,222,333,111"; 
    $SplitInventory1 = explode(",",$Inventory1); 

    $Invoice = "111,222"; 
    $SplitInvoice = explode(",",$Invoice); 


    $SplitResult1 = array_diff($SplitInventory1, $SplitInvoice);  
    echo $JointInventory1 = implode(",",$SplitResult1); 

?> 
+2

'array_diff()' (Gleiches für die ähnlichen Funktionen) nicht die Menge der gleichen Elemente berücksichtigen. Also, wenn es jetzt 1x111 oder 10x111 im Array gibt, ist es egal, es wird nur einmal in der Ausgabe haben, oder nicht. Also für was Sie möchten, dass Sie Ihre eigene Funktion schreiben wollen, indem Sie eine einfache foreach-Schleife verwenden, um jedes Element von einem Array in dem anderen zu lösen. – Rizier123

+0

* "' array_diff' gibt die Werte in array1 zurück, die in keinem der anderen Arrays vorhanden sind "* -' 111' existiert im anderen Array, warum sollte es zurückgegeben werden? – deceze

Antwort

1

HALLO i haben array_filter verwendet, um die Werte der $SplitInventory1 Array filtern $SplitInvoice verwenden. Wenn array_filter'scallback function zurückgeben true wird der aktuelle Wert in den neuen array eingegeben.

so wird stpes sein

1) $var werden die Werte des ersten Arrays wie 111,222,333,444 tragen und zu verwenden wird es array_search überprüfen diese vorhanden sind oder nicht, in $SplitInvoice Array.

2) array_search die key gefundener Wert zurück, so dass, wenn 111 und in $SplitInvoice Array gefunden 222 wird dann Rückruffunktion return false und werden diese Werte nicht aufgeben, in $diff aber als 333 in $SplitInvoice gesucht wird. Dies wird nicht in $SplitInvoice gefunden und Callback-Funktion wird True zurückgeben und es wird in $diff platziert werden.

3) Eine weitere Sache, ich habe unset$SplitInvoice Array, wenn ein Wert gefunden beacuse wir dublicate Einträge (durch 111 benötigen, wenn $ SplitInvoice nicht ungesetzt ist, dann wird es nicht in $diff kommen)

<?php 
    $Inventory1 = "111,222,333,111"; 
    $SplitInventory1 = explode(",",$Inventory1); 
    $Invoice = "111,222"; 
    $SplitInvoice = explode(",",$Invoice); 
    $diff = array_filter($SplitInventory1, 
    function ($val) use (&$SplitInvoice) { 
    $key = array_search($val,$SplitInvoice); 
    if ($key === false) return true; 
    unset($SplitInvoice[$key]); 
    return false; 
    } 
); 

echo "<pre>";print_r($diff); 

?> 

Ausgabe

Array 
(
    [2] => 333 
    [3] => 111 
) 
+2

Hallo Herr, kannst du deine Codes kommentieren? Danke –

+1

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erläuterung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Pfostens zu verbessern . Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen! – Rizier123

+0

... es zieht gutes Karma an ;-) –