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. 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