PHP:相同的对象和阵列失败的`strcmp`序列化
问题描述:
我有一个遗留应用程序,我试图将更改从旧迁移到新的过程中,同时生成更改日志。事情进展顺利;然而,我不断遇到“变化”,没有变化。深入研究之后,我发现遗留代码使用数组,新代码使用对象。如果序列化,我认为它们是相同的。毕竟,如果他们通过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";}
,我怎么可以让你停止???
答
可以使用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
如果他们张玉峰。
+0
不错,那就是诀窍,thx! – WEBjuju
区别在于s:1'和'i:1'。首先是'string',然后是'integer' –
是的,是的,我意识到'strcmp'对于你指出的确切的东西是失败的。问题是,因为在应用程序中,两个序列化的值都会产生相同的输出,所以在这种情况下我们怎么能认识到这两个构造是相同的,除了打字。 – WEBjuju