Bug #72866 [Nab]: in_array confusing strings and integers

From: Date: Wed, 17 Aug 2016 15:50:59 +0000
Subject: Bug #72866 [Nab]: in_array confusing strings and integers
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-203356@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72866&edit=1 ID: 72866 User updated by: imbibinebe at gmail dot com Reported by: imbibinebe at gmail dot com Summary: in_array confusing strings and integers Status: Not a bug Type: Bug Package: *General Issues Operating System: debian PHP Version: 5.6Git-2016-08-17 (Git) Assigned To: cmb Block user comment: N Private report: N New Comment: Sorry, Submitting this as a bug was my mistake. I wished it as a feature request. I think that having "bool $strict = FALSE" by default is very confusing (should be TRUE). At least the 2nd rule you gave me here is complex enough for not being the default behaviour in the case of in_array function, I guess ... Thank you all for your answers anyway. Previous Comments: ------------------------------------------------------------------------ [2016-08-17 15:34:17] cmb@php.net 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 The manual states[1]: | If you compare a number with a string or the comparison involves | numerical strings, then each string is converted to a number and | the comparison performed numerically. And[2]: | The value is given by the initial portion of the string. If the | string starts with valid numeric data, this will be the value | used. Otherwise, the value will be 0 (zero). [1] <http://php.net/manual/en/language.operators.comparison.php> [2] <http://php.net/manual/en/language.types.string.php#language.types.string.conversion> ------------------------------------------------------------------------ [2016-08-17 14:32:21] imbibinebe at gmail dot com And at least, the final result resulting of my test is: // 'string' == 0 -> bool(true) should that be allright ? :) ------------------------------------------------------------------------ [2016-08-17 14:27:24] ryosuke_i_628 at yahoo dot co dot jp Sorry, I was missing your important sentence: > 'Expected result' should be obtained without using the third parameter of in_array BTW, I think this behavior seems to be a little odd, too... Probably you know the related issue; array_unique() was broken at PHP 5.2.9 due to use SORT_REGULAR by default, which feature is reverted at PHP 5.2.10 to use SORT_STRING. ------------------------------------------------------------------------ [2016-08-17 14:21:19] ryosuke_i_628 at yahoo dot co dot jp This is VERY WELL-KNOWN feature of PHP, not a bug. Just pass true as 3rd argument. (default is false) Read documentation: http://php.net/manual/en/function.in-array.php <?php $needle = 's'; $elements = [1]; var_dump(in_array($needle, $elements, false)); // 's' == 1 -> bool(true) var_dump(in_array($needle, $elements, true)); // 's' === 1 -> bool(false) ------------------------------------------------------------------------ [2016-08-17 14:02:53] imbibinebe at gmail dot com Description: ------------ using PHP Version 5.6.14-0+deb8u1 on a debian operating system, here is what I get with the following testing script. I think that 'Expected result' should be obtained without using the third parameter of in_array ([, bool $strict = FALSE ]) otherwise it is very confusing. Test script: --------------- echo 'test1:'.(in_array('string',[0,1])?'true':'false'); echo 'test2:'.(in_array('string',[1])?'true':'false'); echo 'test3:'.(in_array('string',[0])?'true':'false'); Expected result: ---------------- test1:false test2:false test3:false Actual result: -------------- test1:true test2:false test3:true ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=72866&edit=1

« previous php.bugs (#203356) next »