ID:               40616
 User updated by:  phpbugs at jessemccarthy dot net
 Reported By:      phpbugs at jessemccarthy dot net
 Status:           Bogus
 Bug Type:         Arrays related
 Operating System: Linux
 PHP Version:      5.2.1
 New Comment:

> Submitting a patch with any changes you
> might suggest would be even more helpful.

I appreciate that, but unfortunately for that idea, I'm not a C
programmer.  If I was, I'd want to know the patch would have a chance
of being considered before I invested the time.  Given tony2001's
response, I'd be afraid it would just be trashcanned with no
consideration.  I completely appreciate what you're saying, but as a
practical matter it's unrealistic to expect people reporting PHP bugs
to have the capability of fixing them themselves.  I hope you don't
want to discourage people from reporting bugs because they can't
personally fix them.


> Feel free to submit your suggestions for
> rewording the documentation if you believe
> it could be clearer.

Well, I think it would be vastly superior for uasort to perform more
robustly and not have the behavior I described, but if it does behave
that way, I think something like the following would be necessary to
explain it.

I don't think it's a good idea to refer to the documentation for usort
/ uksort for an explanation of the callback function and code examples
for uasort, but if that's how it's going to be then I guess I'd put the
note in the usort documentation.  I'd put the code example in the uasort
documentation.


Documentation changes:
********************

Note:  Two members (call them "A" and "C") that would each compare as
equal to a third member (call it "B") will possibly never be compared
to each other, even if your callback would compare them as unequal.

Example:
<?php

/*

Sort $favorites first by the 'weight' parameter of each element.  If
the 'weight' parameter of two elements is equal and both have a
'title', sort alphabetically by 'title'.

*/

function sort_favorites( $array_element_1, $array_element_2 ) {

  $comparison_result = 0;

  // The array elements have equal 'weight' values

  if ( $array_element_1[ 'weight' ] == $array_element_2[ 'weight' ] )
{

    // Both elements have 'title' set

    if ( isset( $array_element_1[ 'title' ] ) && isset(
$array_element_2[ 'title' ] ) ) {

      // Since 'weight' is equal, compare the elements alphabetically
by 'title'
      $comparison_result = strnatcasecmp( $array_element_1[ 'title' ],
$array_element_2[ 'title' ] );

    }
    // end if

  }
  // end if


  // The array elements have unequal 'weight' values

  else {

    // Compare the elements solely by 'weight'
    $comparison_result = ( ( $array_element_1 > $array_element_2 ) ? 1
: -1 );

  }
  // end else


  return $comparison_result;

}
// end sort_favorites


$favorites = array(

  'A' => array( 'weight' => 10, 'title' => "Favorite movies" ),

  'B' => array( 'weight' => 10 ),

  'C' => array( 'weight' => 10, 'title' => "Favorite music" )

);


uasort( $favorites, 'sort_favorites' );

/*

sort_favorites( $favorites[ 'A' ], $favorites[ 'B' ] ) would return 0

sort_favorites( $favorites[ 'B' ], $favorites[ 'C' ] ) would return 0

sort_favorites( $favorites[ 'A' ], $favorites[ 'C' ] ) will never be
executed

$favorites will not be correctly sorted alphabetically by 'title'

*/

?>

********************


The difficulty of explaining the current behavior just goes to show how
undesirable and counterintuitive it is.

I appreciate the constructive nature of your response, dmytton.


Previous Comments:
------------------------------------------------------------------------

[2007-02-26 19:03:01] [EMAIL PROTECTED]

Feel free to submit your suggestions for rewording the documentation if
you believe it could be clearer. Submitting a patch with any changes you
might suggest would be even more helpful.

------------------------------------------------------------------------

[2007-02-26 17:16:38] phpbugs at jessemccarthy dot net

> Please double-check the documentation...
> Your expectations are wrong.

Sorry, that's a little too vague to be meaningful.  I've read the
documentation.  I just re-read it.  It's counterintuitive, and not
documented, that uasort does not compare certain elements to each other
because it has compared each of them to a different element and jumped
to a conclusion based on that.

That's not quite what I expect from a function advertised as
implementing my "non-trivial" sort criteria.

Even if your position is that the behavior of the function is fine,
it's working as it's intended to, why would you not want to clearly
explain to users what it does -- and can't -- do?  As far as I can
tell, based on the documentation, it is a bug because there is nothing
in the documentation that explains that behavior or prepares me for it.
 If that's the intended behavior of the function, then the documentation
is inadequate.

------------------------------------------------------------------------

[2007-02-26 08:00:51] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Your expectations are wrong.

------------------------------------------------------------------------

[2007-02-24 01:08:30] phpbugs at jessemccarthy dot net

This software broke the line with the URL to the short reproduce code.

http://www.jessemccarthy.net/public/uasort_bug/s_reproduce_source.php

------------------------------------------------------------------------

[2007-02-24 01:03:54] phpbugs at jessemccarthy dot net

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.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/40616

-- 
Edit this bug report at http://bugs.php.net/?id=40616&edit=1

Reply via email to