2017-02-17 22 views
0

У меня есть устаревшее приложение, в котором я пытаюсь перенести изменения из старого в новое при генерации журнала изменений. Дела идут хорошо; однако, я продолжаю работать в «изменениях», которые меняют ничего. Покопавшись в этом, я обнаружил, что устаревший код использует массивы, а новый код использует объекты. Если бы они были сериализованы, я думал, что они будут одинаковыми. В конце концов, если они сбрасываются через print_r, они идентичны. Но это не тот случай. Еще более поразительно, что объекты сохраняют целыми ключами даже после сериализации-несериализации на велосипеде.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