ID: 40616 User updated by: phpbugs at jessemccarthy dot net Reported By: phpbugs at jessemccarthy dot net -Status: Feedback +Status: Open Bug Type: Arrays related Operating System: Linux PHP Version: 5.2.1 New Comment:
Well I apologize. Thanks for your feedback. Short reproduce code: http://www.jessemccarthy.net/public/uasort_bug/short_reproduce_source.php Expected result: array(3) { ["field_favorite_movies"]=> array(1) { ["title"]=> string(15) "Favorite movies" } ["monkey_wrench"]=> string(0) "" ["field_favorite_music"]=> array(1) { ["title"]=> string(14) "Favorite music" } } Actual result: array(3) { ["field_favorite_music"]=> array(1) { ["title"]=> string(14) "Favorite music" } ["monkey_wrench"]=> string(0) "" ["field_favorite_movies"]=> array(1) { ["title"]=> string(15) "Favorite movies" } } I would think that an English description of expected / actual results would be helpful rather than just raw output, but whatever works for you. I also can't help but feel that the original reproduce code made more sense, but this is the most minimal version I can create that still demonstrates anything. Thanks for your attention. Previous Comments: ------------------------------------------------------------------------ [2007-02-23 23:36:10] [EMAIL PROTECTED] >The reproduce code is too long? Yes, please remove everything not related to your problem. >The descriptions of actual and expected output are not >sufficient? Descriptions? No, descriptions are not enough, we need the results, not their descriptions. ------------------------------------------------------------------------ [2007-02-23 23:30:33] phpbugs at jessemccarthy dot net Thanks for your quick response. The reproduce code is too long? The descriptions of actual and expected output are not sufficient? ------------------------------------------------------------------------ [2007-02-23 23:20:42] [EMAIL PROTECTED] And don't forget actual and expected output. ------------------------------------------------------------------------ [2007-02-23 23:19:04] [EMAIL PROTECTED] Please provide a SHORT but complete reproduce code, so we won't have to debug it. ------------------------------------------------------------------------ [2007-02-23 23:13:39] phpbugs at jessemccarthy dot net Description: ------------ I spent hours investigating why my script using uasort() was not producing the expected results before finally discovering that the problem is due to a bug / limitation in the uasort() implementation. I don't know what's actually happening in the source code, but my theory about the problem is that uasort() (or whatever underlying code) cuts corners or tries to use a shortcut based on members that compare as equal. I *know* that "If two members compare as equal, their order in the sorted array is undefined." *However*, once uasort() has found certain members to be equal, it seems to jump to conclusions based on that and doesn't go on to compare other members to each other that need to be. Say for example you have an array with 3 members, call them A, B, and C, where the callback for uasort() would return 0 for A compared to B 0 for B compared to C -1 for A compared to C It seems that if uasort() compares A to B, and B to C and sees that they are "equal", it never compares A to C, which are not equal. I consider it a bug, and a major flaw, but I don't know for sure that people familiar with the code don't intend for it to work that way. Since uasort() / usort() are billed as the solution for sorting by non-trivial criteria, I really think that it should work more robustly and perform more thorough processing in those situations. If there is some reason it can't be made to work that way, there should be a very noticeable warning in the documentation about how limited its functionality is. I encountered this issue in the course of real world development, trying to tailor the order of output of form elements in Drupal based on its weighting system. The uasort() callback in my reproduce code is the Drupal core code modified to sort members alphabetically if the assigned weight values are equal. Printing the values of the arguments in the callback reveals that "A" and "C" (field_favorite_movies and field_favorite_music) are never compared. Reproduce code: --------------- Source: http://www.jessemccarthy.net/public/uasort_bug/reproduce_source.php In action (with PHP 4.4.4., but the same behavior occurs on another server with 5.2, where I originally encountered it): http://www.jessemccarthy.net/public/uasort_bug/reproduce.php Expected result: ---------------- I expect 'field_favorite_movies' to occur prior to 'field_favorite_music' in the sorted array. I expect 'monkey_wrench' to appear anywhere. Actual result: -------------- 'field_favorite_music' occurs prior to 'field_favorite_movies'. If 'monkey_wrench' is excluded from the original array, the order is correct after sorting. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=40616&edit=1