PHP:相同对象和数组失败的`strcmp`序列化

时间:2017-02-17 06:18:52

标签: php arrays object serialization strcmp

我有一个遗留应用程序,我正在尝试将更改从旧版迁移到新版,同时生成更改日志。事情进展顺利;但是,我一直在进入“改变”,改变 nothing 。在深入研究之后,我发现遗留代码使用的是数组而新代码正在使用对象。如果序列化,我认为它们是相同的。毕竟,如果它们通过print_r转储,则它们是相同的。但事实并非如此。更令人惊讶的是,即使在序列化 - 反序列化循环它们之后,对象仍然保持它们的整数键。

请求是:如何显示这两个字符串是相同的,因为它们的结果对象/数组是相同的,除了键入键入。

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

我怎么能让你停下来?

1 个答案:

答案 0 :(得分: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