2017-02-17 2 views
0

Ich habe eine Legacy-App, wo ich versuche, Änderungen von der alten in die neue zu migrieren, während ein Protokoll der Änderungen generiert. Die Dinge laufen gut; aber ich laufe weiter in "Änderungen", die nichts ändern. Nachdem ich das untersucht habe, habe ich festgestellt, dass der Legacy-Code Arrays verwendet und der neue Code Objekte verwendet. Wenn serialisiert, dachte ich, dass sie identisch wären. Denn wenn sie über print_r ausgegeben werden, sind sie identisch. Aber das ist nicht der Fall. Noch erstaunlicher, behalten die Objekte ihre Integer-Tasten auch nach serialisieren-unserialisieren sie zyklisch.PHP: `strcmp' Serialisierung von identischen Objekt und Array Fehler

Die Anfrage lautet: Wie kann ich zeigen, dass diese beiden Strings identisch sind, da ihr resultierendes Objekt/Array identisch ist, abgesehen von der Tastatureingabe.

<?php 
    $v3v = 'a:2:{s:9:"lastindex";s:1:"1";i:1;s:1:"1";}'; 
    $v4v = 'a:2:{s:9:"lastindex";i:1;i:1;s:1:"1";}'; 
    $v3 = unserialize($v3v); 
    $v4 = unserialize($v4v); 
    die('<pre>'.print_r($v3,true).' '.print_r($v4,true)); 

Ausgänge (die identisch):

Array ( [lastindex] => 1 [1] => 1 ) Array ( [lastindex] => 1 [1] => 1 )

so wollen wir sie jetzt bringen "wieder zum Leben":

$v3v = serialize($v3); 
$v4v = serialize($v4); 
die('<pre>'.print_r($v3v,true).PHP_EOL.print_r($v4v,true)); 

whaaa? Wie haben Erinnern Sie sich Ihre ganze Zahl Schlüssel ??“

a:2:{s:9:"lastindex";s:1:"1";i:1;s:1:"1";} 
a:2:{s:9:"lastindex";i:1;i:1;s:1:"1";} 

und wie kann ich Sie ??? zu stoppen bekommen

+0

Unterschied ist in 's: 1' und' i: 1'. Zuerst ist es "string" und in der zweiten ist es "integer" –

+0

ja, ja, ich erkannte, dass die 'strcmp' für genau das fehlgeschlagen ist, worauf Sie hinwiesen. Die Frage ist, da in der Anwendung beide serialisierten Werte die gleiche Ausgabe erzeugen, wie können wir in diesem Fall erkennen, dass diese beiden Konstrukte identisch sind, abgesehen von der Typisierung. – WEBjuju

Antwort

1

können Sie array_diff statt strcmp verwenden Sie können versuchen, diese -.

$v3v = 'a:2:{s:9:"lastindex";s:1:"1";i:1;s:1:"1";}'; 
    $v4v = 'a:2:{s:9:"lastindex";i:1;i:1;s:1:"1";}'; 
    $v3 = unserialize($v3v); 
    $v4 = unserialize($v4v); 
    echo empty(array_diff($v3, $v4)) ? 'Identical' : 'Not Identical'; 

array_diff($v3, $v4) leer array zurück, wenn sie identisch sind,.

Working code

+0

schön, das macht den Trick, thx! – WEBjuju