The following should meet your requirements:
function cmp($a, $b) {
$now = new DateTime("now");
$aDueDate = new DateTime($a->GetDueDate());
$bDueDate = new DateTime($b->GetDueDate());
$aStatus = $a->GetStatus();
$bStatus = $b->GetStatus();
$incompleteStatuses = array(1, 2, 3);
// use date if same status (might not be needed)
if ($aStatus == $bStatus) {
return ($aDueDate < $bDueDate ? -1 : 1);
}
// if A is overdue:
if (in_array($aStatus, $incompleteStatuses) && $aDueDate < $now) {
// if B is overdue too, only consider dates
if (in_array($bStatus, $incompleteStatuses) && $bDueDate < $now) {
return ($aDueDate < $bDueDate ? -1 : 1);
}
return -1; // A definitely first
}
// if B is overdue:
elseif (in_array($bStatus, $incompleteStatuses) && $bDueDate < $now) {
return 1; // B definitely first (we know A is not overdue from above)
}
// both A and B are not overdue; order by status
return $aStatus - $bStatus;
}