Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
Shawn McKenzie schreef: > tedd wrote: >> At 9:56 AM +0100 2/16/09, Jochem Maas wrote: >>> 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()). >> ROTFLOL. <-- I seldom say that! > > Haha! Yes, I was trolling and got a good one from Jochem! I would say > ROTFLMAO! >> From a great height!!! Now that's funny! > > Too funny. I'll have to remember to work this in to some conversation > today at work. ;-) fair play, well taken :-) glad we got it sorted out ;-) > >>> 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) >> The speed of the sort doesn't matter at all. The maximum number of data >> that needed to be sorted in my problem would have been 126 (18 different >> times for 7 days). >> >> I only presented part of the problem here. It was a distilled version of >> the problem I was working on, which was to allow people to enter times >> that they were available for tutoring in two hour chunks. >> >> So, a person might say they were available from 7:00 am to 9:00 am AND >> also state that they were available from 7:30 am to 9:30 am, which was a >> "no-no". >> >> Having two loops allowed me to check after converting to seconds AND >> sorting to see if there were any overlaps. In such case I simply deleted >> the offending data from the array before converting everything back into >> normal time (min:sec). >> >> Re this post -- all I needed was a push in the right direction. I was >> thinking about sorting, but I didn't even consider converting everything >> to seconds and then sorting. >> >> That's really all I needed AND another reason why this list is so great! >> Not only did I get a push in the right direction, but I got a good laugh >> out of it -- "from great heights" indeed. :-) >> >> Thanks and Cheers, >> >> tedd >> > > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
At 9:45 AM -0600 2/16/09, Shawn McKenzie wrote: tedd wrote: At 9:56 AM +0100 2/16/09, Jochem Maas wrote: 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()). ROTFLOL. <-- I seldom say that! Haha! Yes, I was trolling and got a good one from Jochem! I would say ROTFLMAO! From a great height!!! Now that's funny! Too funny. I'll have to remember to work this in to some conversation today at work. ;-) It's good that you take things like that. I've been hammered by people before and it's always nice to see the humor and not take offense. One of the best insults I ever received was right after the OK bombing incident and I was speaking to a group of people and one said "I wonder how big a crater you'll leave if we doused you down with diesel fuel?" -- meaning I was full of fertilizer. I almost died laughing. I have several others. :-) Cheers, tedd -- --- http://sperling.com http://ancientstones.com http://earthstones.com -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
tedd wrote: > At 9:56 AM +0100 2/16/09, Jochem Maas wrote: >> 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()). > > ROTFLOL. <-- I seldom say that! Haha! Yes, I was trolling and got a good one from Jochem! I would say ROTFLMAO! > > From a great height!!! Now that's funny! Too funny. I'll have to remember to work this in to some conversation today at work. ;-) >> 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) > > The speed of the sort doesn't matter at all. The maximum number of data > that needed to be sorted in my problem would have been 126 (18 different > times for 7 days). > > I only presented part of the problem here. It was a distilled version of > the problem I was working on, which was to allow people to enter times > that they were available for tutoring in two hour chunks. > > So, a person might say they were available from 7:00 am to 9:00 am AND > also state that they were available from 7:30 am to 9:30 am, which was a > "no-no". > > Having two loops allowed me to check after converting to seconds AND > sorting to see if there were any overlaps. In such case I simply deleted > the offending data from the array before converting everything back into > normal time (min:sec). > > Re this post -- all I needed was a push in the right direction. I was > thinking about sorting, but I didn't even consider converting everything > to seconds and then sorting. > > That's really all I needed AND another reason why this list is so great! > Not only did I get a push in the right direction, but I got a good laugh > out of it -- "from great heights" indeed. :-) > > Thanks and Cheers, > > tedd > -- Thanks! -Shawn http://www.spidean.com -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
At 9:56 AM +0100 2/16/09, Jochem Maas wrote: 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()). ROTFLOL. <-- I seldom say that! From a great height!!! Now that's funny! 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) The speed of the sort doesn't matter at all. The maximum number of data that needed to be sorted in my problem would have been 126 (18 different times for 7 days). I only presented part of the problem here. It was a distilled version of the problem I was working on, which was to allow people to enter times that they were available for tutoring in two hour chunks. So, a person might say they were available from 7:00 am to 9:00 am AND also state that they were available from 7:30 am to 9:30 am, which was a "no-no". Having two loops allowed me to check after converting to seconds AND sorting to see if there were any overlaps. In such case I simply deleted the offending data from the array before converting everything back into normal time (min:sec). Re this post -- all I needed was a push in the right direction. I was thinking about sorting, but I didn't even consider converting everything to seconds and then sorting. That's really all I needed AND another reason why this list is so great! Not only did I get a push in the right direction, but I got a good laugh out of it -- "from great heights" indeed. :-) Thanks and Cheers, tedd -- --- http://sperling.com http://ancientstones.com http://earthstones.com -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
Remember we have copy-on-write in PHP. Beat this :P : Tim-Hinnerk Heuer http://www.ihostnz.com Fred Allen - "California is a fine place to live - if you happen to be an orange." 2009/2/16 Jochem Maas > 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 = 1 > --- > 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 = 1 > --- > 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 = 1 > --- > timeSort1() ran for 3.891894 seconds > timeSort2() ran for 3.960463 seconds > timeSort3() ran for 18.440713 seconds > > > > > the test script: > === > === > // TEST > ini_set("date.timezone", "Europe/Amsterdam"); > > $iter = 1; > $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
Re: [PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
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 = 1 --- 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 = 1 --- 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 = 1 --- timeSort1() ran for 3.891894 seconds timeSort2() ran for 3.960463 seconds timeSort3() ran for 18.440713 seconds the test script: === === http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Re: Sorting times (SOLVED before tedds crappy SOLVED)
Shawn McKenzie wrote: > Shawn McKenzie wrote: >> tedd wrote: >>> Hi gang: >>> >>> Anyone have/know a routine that will sort an array of times? >>> >>> For example, a function that would take an array like this: >>> >>> time[0] ~ '1:30pm' >>> time[1] ~ '7:30am' >>> time[2] ~ '12:30pm' >>> >>> and order it to: >>> >>> time[0] ~ '7:30am' >>> time[1] ~ '12:30pm' >>> time[2] ~ '1:30pm' >>> >>> >>> Cheers, >>> >>> tedd >>> >>> >> Not tested: >> >> 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): > > > 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. -- Thanks! -Shawn http://www.spidean.com -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php