I have found some odd behaviour while I was using the PHP function in_array(). I have an array like this:
$arr = [TRUE, "some string", "something else"];
Now if I want to check if "test" is in the array it is clearly not, but in_array() still returns TRUE, why is that?
$result = in_array("test", $arr);
var_dump($result); //Output: bool(true)
The same thing happens when using array_search():
$result = array_search("test", $arr);
var_dump($result); //Output: int(0)
I thought maybe that the value TRUE in the array was automatically causing the function to return TRUE for every result without checking the rest of the array, but I couldn’t find any documentation that would suggest that very odd functionality.
This behaviour of the function
in_array()andarray_search()is not a bug, but instead well documented behaviour.Both functions have a 3rd optional parameter called
$strictwhich by default is FALSE:Now what that means is that by default both functions use loosely(
==) comparison to compare the values. So they only check if the values are the same after PHP type juggling and without checking the type. Because of that in your exampleTRUE == "any none emtpy string"evaluates to TRUE.So by setting the 3rd parameter to TRUE while calling the function you say that PHP should use strict(
===) comparison and it should check value AND type of the values while comparing.See this as a reference: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?