At 23:53 03.04.2003, Jonathan Pitcher said:
--------------------[snip]--------------------
>This email is long I apologize for that.  It is my code and then what 
>it returns and what I am wanting it to return.  I don't think I 
>understand how USORT works or even if I am using the right function for 
>what I am looking for.
--------------------[snip]-------------------- 

The compare callback is expected to return anything < 0 if the first value
is less than the second (should sort _before_), 0 if they are identical,
and > 0 if the first value is greater than the second (should sort _after_).

Taking this, your comparison callback directs PHP this way:

if ($A["STARTDATE"] < $B["STARTDATE"]) { return 4; } 
    if $A starts before $B, $A is greater (after $B).
    if both start dates are equal, or $B starts before $A, continue.

else if ($A["STARTTIME"] < $B["STARTTIME"]) { return 3; } 
    if $A starts before $B, $A is greater (after $B).
    if both start times are equal, or $B starts before $A, continue.

else if ($A["ENDDATE"] > $B["ENDDATE"]) { return 2; } 
    if $A ends after $B, $A is greater (after $B).
    if both end dates are equal, or $A ends before $B, continue.

else if ($A["ENDTIME"] > $B["ENDTIME"]) { return 1; } 
    if $A ends after $B, $A is greater (after $B).
    if both end times are equal, or $A ends before $B, continue.

else if ($A["STARTDATE"] > $B["STARTDATE"]) { return -4; } 
    if $A starts after $B, $A is less (before $B).
    if both start dates are equal, continue.

else if ($A["STARTIME"] > $B["STARTTIME"]) { return -3; } 
    if $A starts after $B, $A is less (before $B).
    if both start times are equal, continue.

else if ($A["ENDDATE"] < $B["ENDDATE"]) { return -2; } 
    if $A ends before $B, $A is less (before $B).
    if both end dates are equal, continue.

else if ($A["ENDTIME"] < $B["ENDTIME"]) { return -1; } 
    if $A ends before $B, $A is less (before $B).
    if both end times are equal, continue.

else { return 0; }
    they are identical.

I believe you see where the problem is. You may express your comparison in
a shorter and possibly clearer form like this (not tested but looks as if
it should work):

if ($A['STARTDATE'] < $B['STARTDATE']) return -1;         // a starts before B
elseif ($A['STARTDATE'] == $B['STARTDATE']) {             // starts at the
same day
    if ($A['STARTTIME'] < $B['STARTTIME']) return -1;     // a starts before B
    elseif ($A['STARTTIME'] == $B['STARTTIME']) {         // same start day
and time
        // here both courses start at the same day/time,
        // so we need to sort them by enddate/time
        if ($A['ENDDATE'] < $B['ENDDATE']) return -1;     // a ends before B
        elseif ($A['ENDDATE'] == $B['ENDDATE']) {         // ends at the
same day
            if ($A['ENDTIME'] < $B['ENDTIME']) return -1; // a ends before B
            elseif ($A['ENDTIME'] == $B['ENDTIME']) {     // same end day
and time
                // identical
                return 0;
            }
        }
    }
}
// we've tested all possibilities for A being less or equal to B
// so there's only one more choice left - A is greater :)
return 1;



-- 
   >O     Ernest E. Vogelsinger
   (\)    ICQ #13394035
    ^     http://www.vogelsinger.at/



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to