Save Ukraine

PHP: in_array strict mode

Christian Kruse,

Today I stumbled upon a problem in a legacy software I have to maintain. Given the following snippet:

$cats = $config->get('todos/important_categories');
if(in_array($given_cat, $cats)) {
  # do something
}

$given_cat was "hobby" and $cats was array('news', 'fun', 0). I don't know who put the 0 into the configuration and it doesn't matter. But what matters is that the in_array call returned true. While I suspected that the type system was the problem, I checked the manual page. It says:

Searches haystack for needle using loose comparison unless strict is set.

That basically means that in_array() uses == to compare the search value and the current array element. And since strings that can't be parsed to numbers are converted to 0 when compared to an integer:

➜ ckruse@vali ~  % php -r 'var_dump(0 == "abc");'
bool(true)
➜ ckruse@vali ~  % php -r 'var_dump("abc" == 0);'
bool(true)
➜ ckruse@vali ~  %

this gave me true for the last element. To avoid that one has to use the third parameter for in_array, defaulting to false:

If the third parameter strict is set to TRUE then the in_array() function will also check the types of the needle in the haystack.

So the correct version of the snippet above would be this:

$cats = $config->get('todos/important_categories');
if(in_array($given_cat, $cats, true)) {
  # do something
}

Since I didn't know about the $strict parameter I thought it might be useful to write a short post about it.