Re: usort for sorting an array of objects

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2008-12-11 at 11:44 +1300, German Geek wrote:
> On Thu, Dec 11, 2008 at 6:43 AM, Robert Cummings <robert@xxxxxxxxxxxxx>wrote:
> 
> > On Thu, 2008-12-11 at 01:31 +1300, German Geek wrote:
> > > On Wed, Dec 10, 2008 at 10:27 PM, Stut <stuttle@xxxxxxxxx> wrote:
> > >
> > > > On 10 Dec 2008, at 04:15, German Geek wrote:
> > > >
> > > >> I need to sort an array of objects. I found this ( at a url that didnt
> > let
> > > >> me send this msg... ) and I would know how to do it, but I believe
> > there
> > > >> might be a cleaner, more elegant way to do it. In Java, you just need
> > to
> > > >> implement the interface Comparable and provide a method called
> > compareTo
> > > >> (as
> > > >> far as i remember) and then you can use one of the many sorting
> > algorithms
> > > >> generically on objects that are comparable...
> > > >>
> > > >> Anyway, I didn't find something like that for PHP. Since I'm using
> > > >> symfony,
> > > >> I had a bit of a play with the objects at hand and simply did a
> > > >> sort($arrayOfObjects) and it did sort them by the id. Just wondering
> > where
> > > >> it got the information on what to sort on (not quite) correctly for my
> > > >> case?
> > > >>
> > > >
> > > > I'm confused. The function you need is the one you mention in the
> > subject.
> > > > All you need to do is create a function that compares two of the
> > objects, in
> > > > whatever way you need it to, and returns -1, 0 or 1. The pass that to
> > the
> > > > usort function - it doesn't care what type of thing is in the array.
> > Full
> > > > details available at http://php.net/usort.
> > >
> > >
> > >
> > > I just ment to say it would be nice to have it like in Java or C# where
> > you
> > > can implement an interface, called Comparable and define a function in
> > the
> > > class called compareTo which returns an integer smaller, equal or greater
> > > than 0 by which elements can generically be sorted by in a collection.
> > Since
> > > PHP has arrays (hash maps) as the primary collection type, and they are
> > very
> > > good for storing sets or other collections, it would be nice to have a
> > sort
> > > function that would look, if the elements of the array have a compareTo
> > > method (implement the Comparable interface), and if they do, then sort
> > with
> > > that. I find it a bit surprising that such a well designed programming
> > > language doesn't have such a useful feature. I guess one could use one of
> > > the gazillion libraries out there to do the same thing. Also, one could
> > > argue that this further checking would slow down functions that are
> > > primarily used for sorting strings. However, the answer could be also in
> > the
> > > ArrayObject class which is in php natively. Only it should implement all
> > the
> > > array functions that are there anyway, which shouldnt be too hard to do
> > for
> > > the PHP PL developers. Some more in depth documentation of that class
> > would
> > > also be helpful.
> > >
> > > Anyway, I found a not perfect, but good enough solution:
> > >
> > > Implement a static compare function in the class of the object and put a
> > > function in my library, that is simply called myTools::sort that will get
> > > the object class of the first element of the array (if there is one) and
> > > sort according to the compare method implemented in that class (if it
> > > exists), otherwise just use sort. The compare method takes the parameters
> > as
> > > self:
> > >
> > > public class AClass { // implements Comparable {
> > >   public static function compare(self $obj1, self $obj2) {
> > >     return strcmp($obj1->prop1, $obj2->prop1); // e.g.
> > >   }
> > > }
> > >
> > > That way I will get an exception if there is an object in the array which
> > > does not have that class, but i can live with that. At least i'll get an
> > > exception and not another funny error, because the parameters are self,
> > > right?
> > >
> > > It might be better to define an interface called Comparable with that
> > > method, but was not really necessary for my case.
> > >
> > > Just a few thoughts to maybe improve PHP in the future. Hopefully there
> > will
> > > be a lot of interfaces and objects for collection types at some stage in
> > PHP
> > > natively, although that might clutter the namespace and could be realised
> > > with libraries. What are your thoughts?
> >
> > You can already do what you want. Implement it yourself. Not everyone
> > wants this level of cruft and inefficiency.
> 
> 
> Inefficiency for me is when it takes longer to code. For one second of
> coding time I can waste 1000ms of processing time without any cost. Think
> about what a computer can do in 1000ms. Calling a function generically takes
> next to nothing in processing time (maybe 0.5ms or less. In fact some db
> queries take less than that in my experience...

Regardless of your personal implementation preferences, PHP offers a
sorting mechanism, it's up to you to massage it into your personal
paradigm of the day.

Cheers,
Rob.
-- 
http://www.interjinn.com
Application and Templating Framework for PHP


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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux