2017-02-17 39 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