user3052443
user3052443

Reputation: 842

In_array not working - compare two files

The code below is a simple version of what I am trying to do. The code will read in two files, see if there is a matching entry and, if there is, display the difference in the numbers for that item. But it isn't working. The first echo displays the word but the second echo is never reached. Would someone please explain what I am missing?

    $mainArry = array('Albert,8');
    $arry =     array('Albert,12');

    foreach ($arry as $line) {
        $kword = explode(',', $line); 
        echo 'kword '.$kword[0];
        if (in_array($kword[0], $mainArry)) {
            echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
        }
    } 

Upvotes: 0

Views: 73

Answers (3)

MarcM
MarcM

Reputation: 2251

Your $mainArry contains a single element: the string 'Albert,8'. It looks like you want to use it as an array (elements 'Albert' and '8') instead of a string.

You mention the code will read from two files, so you can 'explode' it to a real array, as you do with $arry. A simpler approach would be using str_getcsv() to parse the CSV string into $mainArry.

$inputString = 'Albert,8';
$mainArry = str_getcsv($inputString); // now $mainArry is ['Albert','8']
$arry =     array('Albert,12');

foreach ($arry as $line) {
    $kword = explode(',', $line); 
    echo 'kword '.$kword[0];
    if (in_array($kword[0], $mainArry)) {
        echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
    }
} 

Test it here.

Upvotes: 2

Martin
Martin

Reputation: 22760

I don't recommend your way of working, but this is a solution, basically the process you apply to the $arry should also apply to the $mainArry you're trying to compare it to.

 $mainArry = array('Albert,8');
    $arry =     array('Albert,12');

/***
NEW function below takes the valus out of the main array.
    and sets them in their own array so they can be properly compared. 
***/
 foreach ($mainArry as $arrr){
 $ma = explode(",",$arrr);
 $names[] = $ma[0];
 $values[] = $ma[1];
 }
 unset($arrr,$ma);


    foreach ($arry as $line) {
        $kword = explode(',', $line); 
        echo 'kword '.$kword[0];
        /// note var reference here is updated. 
        if (in_array($kword[0], $names)) {
            echo '<br>line '.$kword[0]. ' has count of '.$kword[1] . '<br>';
        }
    }

Yeah, MarcM's answer above does the same thing in a neat single line, but I wanted to illustrate a little more under the hood operations of the value setting. :-/

Upvotes: 0

Wold
Wold

Reputation: 972

You are attempting to compare the string Albert with Albert,8, so they won't match. If you want to check if the string contains the keyword, assuming your array has more than one element, you could use:

$mainArry = array('Albert,8');
$arry =     array('Albert,12');

foreach ($arry as $line) {
    $kword = explode(',', $line); 
    echo 'kword '.$kword[0];
    foreach ($mainArry as $comp) {
        if (strstr($comp, $kword[0])) {
            echo 'line '.$line. ' has count of '.$kword[1] . '<br>';
        }
    }
}

example: https://eval.in/728566

Upvotes: 0

Related Questions