Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does this recursive in_array function wrongly return true? [duplicate]

Tags:

arrays

php

I'm trying to debug a script I wrote and there is an issue that comes down to checking if an identifier is present inside an (multidimensional) array of assets. I am using an in_array function that searches recursively that I got from this question.

Here is the function:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}

I am using this data:

The needle: 'B51MM36'
The haystack: (apologies for the unbeautified array - couldn't find a way to beautify from var_export)

$sedols = array ( 0 => array ( 'ipsid' => '72', 'buyList' => '1', 'sedol' => 'B8LFDR7', 'isin' => 'LU0827876409', 'currency' => NULL, 'hedged' => '0', 'acc' => '0', 'inst' => '0', 'description' => 'BlackRock European Long Only', 'nonUKsitus' => '0', 'reportingStatus' => '0', 'matchScore' => 0, ), 1 => array ( 'ipsid' => '72', 'buyList' => '1', 'sedol' => 'LU0827876151', 'isin' => 'LU0827876151', 'currency' => 'USD', 'hedged' => '1', 'acc' => '1', 'inst' => '0', 'description' => 'Blackrock European Long Only', 'nonUKsitus' => '0', 'reportingStatus' => '0', 'matchScore' => 0, ), 2 => array ( 'ipsid' => '72', 'buyList' => '1', 'sedol' => 'LU0406496546 ', 'isin' => 'LU0406496546 ', 'currency' => 'EUR', 'hedged' => '1', 'acc' => '1', 'inst' => '0', 'description' => 'Blackrock European Long Only', 'nonUKsitus' => '0', 'reportingStatus' => '0', 'matchScore' => 0, ), 3 => array ( 'ipsid' => '72', 'buyList' => '1', 'sedol' => 'LU0827876409', 'isin' => 'LU0827876409', 'currency' => 'GBP', 'hedged' => '1', 'acc' => '0', 'inst' => '0', 'description' => 'Blackrock European Long Only', 'nonUKsitus' => '0', 'reportingStatus' => '1', 'matchScore' => 1, ), );

when I run var_dump(in_array_r('B51MM36', $sedols)); it outputs bool(true). I am confused as the string 'B51MM36' does not appear anywhere in the haystack array. Can anyone identify what is going on here?

like image 774
harryg Avatar asked Jul 05 '26 11:07

harryg


2 Answers

The reson is that

var_dump('B51MM36' == 0);

is true, don't know why (maybe it convert the string to integer), but this work

var_dump(in_array_r('B51MM36', $sedols, true));

try remove strict option

like image 143
jcubic Avatar answered Jul 07 '26 02:07

jcubic


As has been mentioned by others, logic will not produce expected results. You must make suer the type matches as well. PHP does type juggling: http://php.net/manual/en/language.operators.comparison.php

So in this case 0=='B51MM36' will return true since value of B51MM36 is 0 after casting.

Hope this helps

like image 28
tr33hous Avatar answered Jul 07 '26 02:07

tr33hous



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!