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... -- Tim-Hinnerk Heuer http://www.ihostnz.com