$Root[DiffString]";
function DirDiff($Dir1, $Dir2) //Returns Array(DiffString, NumItems, NumDifferences)
{
//Determine all the file and subdirectory names in both directories
$DirectoryNames=Array();
$FileNames=Array();
foreach(Array($Dir1, $Dir2) as $CurDir)
foreach($CurDir as $ItemName => $Item)
if(is_array($Item))
$DirectoryNames[$ItemName]=0;
else
$FileNames[$ItemName]=0;
//Sort directory and file lists into a natural case order
$DirectoryNames=array_keys($DirectoryNames);
$FileNames=array_keys($FileNames);
natcasesort($DirectoryNames);
natcasesort($FileNames);
//Output list of items (directories then files) within this directory
$NumDifferences=0;
$NumItems=0;
$RetVal='
'; //Start a directory listing
foreach($DirectoryNames as $Directory)
{
$OneSideOnly=(!isset($Dir1[$Directory]) ? ' OnR' : (!isset($Dir2[$Directory]) ? ' OnL' : '')); //Determine if only one of the directories has this item
$SubInfo=DirDiff($OneSideOnly==' OnR' ? Array() : $Dir1[$Directory], $OneSideOnly==' OnL' ? Array() : $Dir2[$Directory]); //Recurse through subdirectories (use empty array if one of the sides does not contain this entry)
$NumItems+=$SubInfo['NumItems']; //Add number of items in directory to total number of items
$NumDifferences+=$MyNumDifferences=($OneSideOnly=='' ? $SubInfo['NumDifferences'] : 1); //Add number of differences in directory to total number of differences. If this item is only on one side, consider it only 1 difference.
$RetVal.=
'- '.htmlentities($Directory)." ($MyNumDifferences/$SubInfo[NumItems]) $SubInfo[DiffString]
"; //The directories: Name, Num items, num differences, sub content; and end of the directory item
}
foreach($FileNames as $File)
{
$OneSideOnly=(!isset($Dir1[$File]) ? ' OnR' : (!isset($Dir2[$File]) ? ' OnL' : '')); //Determine if only one of the directories has this item
$IsDiff=($OneSideOnly || $Dir1[$File]!=$Dir2[$File]);
$NumDifferences+=($IsDiff ? 1 : 0); //Add 1 to number of differences if files do not match
$RetVal.=
'- '.htmlentities($File).(!$OneSideOnly && $IsDiff ? " ($Dir1[$File] :: $Dir2[$File])" : '').'
'; //The files name, differences, and end of the directory item
}
$NumItems+=count($FileNames); //Add number of files to total number of items
$RetVal.='
'; //End a directory listing
return Array('DiffString'=>$RetVal, 'NumItems'=>$NumItems, 'NumDifferences'=>$NumDifferences);
}
?>