2016-08-30 3 views
1

Die PHP documentation eindeutig festPHP array_diff Fehler?

Vergleicht array1 gegen einen oder mehrere andere Arrays und gibt die Werte in array1, die in irgendeiner der anderen Arrays nicht vorhanden sind.

Dies scheint nicht ganz der Fall zu sein. Nehmen Sie das folgende Beispiel

$a = array(1,2,3,4); 
$b = array(3,4,5); 
echo "b FROM a = "; 
echo json_encode(array_diff($a,$b)); 
echo "<br>a FROM b = "; 
echo json_encode(array_diff($b,$a)); 

, die in einem Fall und eine assoziative Array in dem anderen

b FROM a = [1,2] 
a FROM b = {"2":5} 

das heißt einer einfachen Anordnung zurückgibt. Leicht zu beheben - ich sorge mich nur um die Werte, so kann ich einfach eine array_values(array_diff machen. Es stört mich jedoch, dass die Dokumentation über diesen Unterschied hinweggeht. Vielleicht kann jemand hier mehr Licht auf das werfen, was vor sich geht?

+1

Tipp von 0, so dass sie in der json gespeichert sind

Wenn Sie keine Schlüssel Assoziativität beibehalten möchten, verwenden Sie

echo json_encode(array_values(array_diff($b,$a))); 

die Schlüssel zurück: verwenden 'print_r'/'var_dump' zum Debuggen von PHP v alues. Die Einführung einer ganzen 'anderen Technologie (JSON) in den Mix verkompliziert nur die Dinge ... – deceze

+0

Guter Punkt - Ich benutze json_encode oft ganz einfach, weil die Ausgabe kompakter ist. – DroidOS

Antwort

3

Es ist nicht PHP, die Magie etwas zu tun hat, ist es json

array_diff() hält Tasten/Assoziativität

b from a kehrt

array(
    0 => 1 
    1 => 2 
) 

a from b kehrt

array(
    2 => 5 
) 

Wenn Sie konvertieren zu json, der json doesn ‚T mit den Tasten stören, wenn sie von 0 numerisch sind und um 1 erhöht wird, so dass die Schlüssel aus b from a werden im json ignoriert, da sie

jedoch, dass die Kriterien entsprechen, die Schlüssel aus dem a from b Ergebnis sind natürlich nicht erhöht werden wie natürlich Inkrementieren

+0

Schön ... aber ich frage mich, wo in den Dokumenten sehen Sie explizit erwähnt, dass _array_diff() Matches/Assoziativität_. Ich sehe nichts dergleichen. – DroidOS

+0

'Gibt ein Array zurück, das alle __entries__ von array1 enthält, die in keinem der anderen Arrays vorhanden sind.' Verwendet den Begriff 'entries', was normalerweise sowohl Schlüssel als auch Werte bedeutet; Das Beispiel zeigt auch, dass Schlüssel gepflegt sind ('Array ( [1] => blau )') –