These three functions call themselves recursively and handle any nesting levels of arrays/objects/values and do strict comparisons. The entry-point to this function set would be "valuesAreIdentical".
if($type1!==$type2){
returnfalse;
}
switch(true){
case ($type1==='boolean'||$type1==='integer'||$type1==='double'||$type1==='string')://Do strict comparison here.if($v1!==$v2){
returnfalse;
}
break;
case ($type1==='array'):$bool=arraysAreIdentical($v1,$v2);
if($bool===false){
returnfalse;
}
break;
case'object':$bool=objectsAreIdentical($v1,$v2);
if($bool===false){
returnfalse;
}
break;
case'NULL'://Since both types were of type NULL, consider their "values" equal.break;
case'resource'://How to compare if at all?break;
case'unknown type'://How to compare if at all?break;
}//end switch
//All tests passed.returntrue;
}
functionobjectsAreIdentical($o1,$o2):bool{//See if loose comparison passes.if($o1!=$o2){
returnfalse;
}//Now do strict(er) comparison.$objReflection1= newReflectionObject($o1);$objReflection2= newReflectionObject($o2);$arrProperties1=$objReflection1->getProperties(ReflectionProperty::IS_PUBLIC);$arrProperties2=$objReflection2->getProperties(ReflectionProperty::IS_PUBLIC);$bool=arraysAreIdentical($arrProperties1,$arrProperties2);
if($bool===false){
returnfalse;
}
foreach($arrProperties1as$key=>$propName){$bool=valuesAreIdentical($o1->$propName,$o2->$propName);
if($bool===false){
returnfalse;
}
}//All tests passed.returntrue;
}
functionarraysAreIdentical(array$arr1, array$arr2):bool{$count=count($arr1);//Require that they have the same size.if(count($arr2) !==$count){
returnfalse;
}//Require that they have the same keys.$arrKeysInCommon=array_intersect_key($arr1,$arr2);
if(count($arrKeysInCommon)!==$count){
returnfalse;
}//Require that their keys be in the same order.$arrKeys1=array_keys($arr1);$arrKeys2=array_keys($arr2);
foreach($arrKeys1as$key=>$val){
if($arrKeys1[$key] !==$arrKeys2[$key]){
returnfalse;
}
}//They do have same keys and in same order.foreach($arr1as$key=>$val){$bool=valuesAreIdentical($arr1[$key],$arr2[$key]);
if($bool===false){
returnfalse;
}
}//All tests passed.returntrue;
}?>