|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-12-11 12:19 UTC] reallfqq-php at yahoo dot fr
Description: ------------ PHP's comparison operators are circular, generatng situations where impossible equalities are considered valid. This bug is posted in reference to: http://phpsadness.com/sad/52 Test script: --------------- <?php function is_sorted($array) { $n = count($array); for ($a=0; $a<$n-1; $a++) { for ($b=$a+1; $b<$n; $b++) { if ($array[$a] > $array[$b]) { return false; } } } return true; } $array = array(INF, array(), (object)array()); sort($array); var_dump(is_sorted($array)) ?> Expected result: ---------------- bool(true) Actual result: -------------- bool(false) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Dec 05 12:00:01 2025 UTC |
Short answer : *Wrong*. Try the following code: <?php $a = 15; $b = array(); $c = (object)array(); var_dump($a < $b); var_dump($b < $c); var_dump($c < $a); ?> Result: bool(true) bool(true) bool(true) ---------- Long answer: Please do not oversee the problem and oversimplify it. I am talking about operators, not constants. The problem is not INF at all. Have you checked the linked webpage? The first example show non-transitivity of some operators: php -r 'var_dump(TRUE == "a"); var_dump("a" == 0); var_dump(TRUE == 0);' Expected : bool(true) bool(true) bool(true) Actual: bool(true) bool(true) bool(false) Then, and I think that is the biggest concern, there is circular references in the operators chain, demonstrated in the bug report. The bug report example actual shows a near-real-world use-case where the sort function is unable to do its job. That is more spectacular.Just to note, this is the actual output. PHP Notice: Object of class stdClass could not be converted to int in ./sorting.php on line 11 PHP Stack trace: Notice: Object of class stdClass could not be converted to int in ./sorting.php on line 11 PHP 1. {main}() ./sorting.php:0 Call Stack: PHP 2. is_sorted() ./sorting.php:23 0.0002 226856 1. {main}() ./sorting.php:0 0.0003 228360 2. is_sorted() ./sorting.php:23 bool(false) Almost as if the code is trying to tell you that you're doing something bogus...