<?php
declare(strict_types=1);
// JSON object member order is not contractual; array order and scalar types are.
function strictWireEqual($actual,$expected):bool
{
    if(gettype($actual)!==gettype($expected))return false;
    if(is_object($actual)){$a=get_object_vars($actual);$b=get_object_vars($expected);$ak=array_keys($a);$bk=array_keys($b);sort($ak);sort($bk);if($ak!==$bk)return false;foreach($a as $k=>$v)if(!strictWireEqual($v,$b[$k]))return false;return true;}
    if(is_array($actual)){if(array_keys($actual)!==array_keys($expected))return false;foreach($actual as $k=>$v)if(!strictWireEqual($v,$expected[$k]))return false;return true;}
    return $actual===$expected;
}
