Shawn McKenzie schreef: > Shawn McKenzie wrote: ... >>> Not tested: no shit. >>> function time_sort($a, $b) >>> { >>> if (strtotime($a) == strtotime($b)) { >>> return 0; >>> } >>> return (strtotime($a) < strtotime($b) ? -1 : 1; >>> } >>> >>> usort($time, "time_sort"); >>> >> Well, I just thought, since the strtotime() uses the current timestamp >> to calculate the new timestamp, if you only give it a time then the >> returned timestamp is today's date with the new time you passed. If you >> had a large array and the callback started at 23:59:59 then you could >> end up with some times from the date it started and some from the next >> day, which of course would not be sorted correctly with respect to times >> only. So, this might be better (not tested): >> ditto (as in nice syntax error). >> >> function time_sort($a, $b) >> { >> static $now = time(); >> >> if (strtotime($a, $now) == strtotime($b, $now)) { >> return 0; >> } >> return (strtotime($a, $now) < strtotime($b, $now) ? -1 : 1; >> } >> >> > Your best bet above. and G.W.Bush is a socialist. > I did a little test, the ultra-fast version offered by McKenzie is really great as long as your array of time strings aren't ever going to be longer than say 3-4 items (with the caveat that you don't use a second argument to strtotime() ... if you do then even with 3 items it's substantially slower). for any reasonable number of items my tests show tedd's version pisses on McKenzies from a great height (note that I actually optimized Mckenzies variant by halfing the number of calls to strtotime()). I added a third variant, as a sort of control, which runs pretty much on par with tedd's version but uses rather less LOC (tedd you might like it as a little example of using array_multisort(), i.e. a way of avoiding writing the double foreach loop in this case) tedd's variant: sortTime1() McKenzie's variant: sortTime2() my variant: sortTime3() sample output from one of my test runs: =============================================================== =============================================================== No. of array items = 3, no of iterations = 10000 ------- timeSort1() ran for 1.306011 seconds timeSort2() ran for 1.337358 seconds timeSort3() ran for 1.742724 seconds No. of array items = 6, no of iterations = 10000 ------- timeSort1() ran for 2.647697 seconds timeSort2() ran for 2.475791 seconds timeSort3() ran for 7.268916 seconds No. of array items = 9, no of iterations = 10000 ------- timeSort1() ran for 3.891894 seconds timeSort2() ran for 3.960463 seconds timeSort3() ran for 18.440713 seconds the test script: =============================================================== =============================================================== <?php // TEST ini_set("date.timezone", "Europe/Amsterdam"); $iter = 10000; $time = array( array("1:30pm", "7:30am", "12:30pm"), array("1:30pm", "7:30am", "12:30pm", "4:45pm", "8:15am", "11:00pm"), array("1:30pm", "7:30am", "12:30pm", "4:45pm", "8:15am", "11:00pm", "4:30am", "6:45am", "12:00pm"), ); foreach ($time as $t) testIt($t, $iter); // FUNCS function sortTime1($in_times) { $time = array(); foreach ($in_times as $t) $time[] = strtotime($t); sort($time); $sort_time = array(); foreach ($time as $t) $sort_time[] = date("g:ia", $t); return $sort_time; } function timeSort2($in) { static $time = null; if (!$time) $time = time(); $now = array_fill(0, count($in), $time); $out = array_map("strtotime", $in, $now); array_multisort($out, SORT_NUMERIC, SORT_ASC, $in); return $in; } function timeSort3($a, $b) { static $now = null; if (!$now) $now = time(); $a = strtotime($a, $now); $b = strtotime($b, $now); if ($a == $b) return 0; return $a < $b ? -1 : 1; } function testIt($time, $iter) { echo "\nNo. of array items = ", count($time), ", no of iterations = $iter\n-------\n"; $s = microtime(true); for ($i = 0; $i < $iter; $i++) timeSort2($time); $e = microtime(true); echo "timeSort1() ran for ".round($e-$s, 6)." seconds \n"; $s = microtime(true); for ($i = 0; $i < $iter; $i++) timeSort2($time); $e = microtime(true); echo "timeSort2() ran for ".round($e-$s, 6)." seconds \n"; $s = microtime(true); for ($i = 0; $i < $iter; $i++) usort($time, "timeSort3"); $e = microtime(true); echo "timeSort3() ran for ".round($e-$s, 6)." seconds \n"; } -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php