2017-02-17 46 views
0

我有一個遺留應用程序,我試圖將更改從舊遷移到新的過程中,同時生成更改日誌。事情進展順利;然而,我不斷遇到「變化」,沒有變化。深入研究之後,我發現遺留代碼使用數組,新代碼使用對象。如果序列化,我認爲它們是相同的。畢竟,如果他們通過print_r傾銷,他們是相同的。但事實並非如此。更令人震驚的是,對象保留它們的整數鍵,即使在serialize-unserialize循環它們之後。PHP:相同的對象和陣列失敗的`strcmp`序列化

請求是:我怎麼能顯示這兩個字符串是相同的,因爲它們的結果對象/數組是相同的除了鍵入。

<?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)); 

輸出(相同的):

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

現在讓我們把他們 「起死回生」:

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

whaaa?你怎麼記得你的整數鑰匙?」

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";} 

,我怎麼可以讓你停止???

+0

區別在於s:1'和'i:1'。首先是'string',然後是'integer' –

+0

是的,是的,我意識到'strcmp'對於你指出的確切的東西是失敗的。問題是,因爲在應用程序中,兩個序列化的值都會產生相同的輸出,所以在這種情況下我們怎麼能認識到這兩個構造是相同的,除了打字。 – WEBjuju

回答

1

可以使用array_diff代替strcmp你可以試試這個 -

$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)將返回空array如果他們張玉峯。

Working code

+0

不錯,那就是訣竅,thx! – WEBjuju