PHP: 相同对象和数组的 `strcmp` 序列化失败
PHP: `strcmp` serialization of identical object and array failing
我有一个遗留应用程序,我试图在生成更改日志的同时将更改从旧版本迁移到新版本。事情进展顺利;但是,我将 运行 保留为 "changes",这改变了 nothing。深入研究之后,我发现遗留代码使用的是数组,而新代码使用的是对象。如果连载,我认为它们将是相同的。毕竟,如果它们通过 print_r
转储,它们是相同的。但事实并非如此。更令人震惊的是,对象 保留 它们的整数键,即使在序列化-反序列化循环它们之后也是如此。
请求是:我如何才能证明这两个字符串是相同的,因为它们的结果 object/array 除了按键输入是相同的。
<?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
)
所以现在让我们把它们带来"back to life":
$v3v = serialize($v3);
$v4v = serialize($v4);
die('<pre>'.print_r($v3v,true).PHP_EOL.print_r($v4v,true));
哇哦?你是怎么记住你的整数键的??"
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)
将 return 清空 array
。
我有一个遗留应用程序,我试图在生成更改日志的同时将更改从旧版本迁移到新版本。事情进展顺利;但是,我将 运行 保留为 "changes",这改变了 nothing。深入研究之后,我发现遗留代码使用的是数组,而新代码使用的是对象。如果连载,我认为它们将是相同的。毕竟,如果它们通过 print_r
转储,它们是相同的。但事实并非如此。更令人震惊的是,对象 保留 它们的整数键,即使在序列化-反序列化循环它们之后也是如此。
请求是:我如何才能证明这两个字符串是相同的,因为它们的结果 object/array 除了按键输入是相同的。
<?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
)
所以现在让我们把它们带来"back to life":
$v3v = serialize($v3);
$v4v = serialize($v4);
die('<pre>'.print_r($v3v,true).PHP_EOL.print_r($v4v,true));
哇哦?你是怎么记住你的整数键的??"
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)
将 return 清空 array
。