tags:

views:

257

answers:

5

This one is completely beyond me. I'm trying to compare two strings. When I echo them, they appear to be identical, yet when I compare them with the '==' operator, it returns false. For example, when running the code below on my database. It outputs things like "APPARENTLY Apple does not equal Apple". Can anyone shed any light on this?

if ($this->data['list_text']) { //user has entered into textarea
   $list = nl2br($this->data['list_text']);

   $list_array = explode('<br />',$list);

   $ranking = 1;
   $company_array = $this->CompanyList->CompanyRanking->Company->find('list',null);

   //this is the comparison bit
   foreach ($list_array as $key => $value) {
    $companyId = null;
    foreach ($company_array as $key2 => $value2) {
     if ($value2 != $value) {
      echo 'APPARENTLY '.$value2.' does not equal '.$value;       
     } else {
      $companyId = $key2;
      break;
     }
    }

    $this->data['CompanyRanking'][$ranking]['ranking'] = $ranking;
    $this->data['CompanyRanking'][$ranking]['company_id'] = $companyId;
    $ranking++;
   }
  }
+2  A: 

Do the strings have any extra whitespace you're not seeing? Try trimming them.

Ólafur Waage
In a similar vein, try using `echo 'APPARENTLY >'.$value2.'< does not equal >'.$value.'<';` which will also illustrate this better.
Matthew Scharley
Thanks for the suggestion. I tried adding "if (trim($value2) != trim($value))" and I'm still getting "APPARENTLY Apple does not equal Apple".
gomezuk
On another note, my code posted above would be faster as you do not perform the first trim on $value for every iteration of $company_array.
cballou
just trim() is probably not enough because it will only trim whitespace at the beginning and the end of the strings.
tharkun
+1  A: 

I agree with Olafur. I removed trim and replaced it with a preg_replace due to the fact you are assuming $value and $value2 are companyIDs. You can make a quick modification on these if the companyID is supposed to be alphanumeric, contain hyphens, etc... This version should do it:

if ($this->data['list_text']) { 
    $list = nl2br($this->data['list_text']);
    $list_array = explode('<br />', $list);

    $ranking = 1;
    $company_array = $this->CompanyList->CompanyRanking->Company->find('list',null);

    foreach ($list_array as $key => $value) {

        // remove any non digit characters
        $value = preg_replace('/[^0-9]/i','', $value); 
        $companyId = null;

        foreach ($company_array as $key2 => $value2) {

            // remove any non digit characters
            $value2 = preg_replace('/[^0-9]/i','', $value2); 

            if ($value2 != $value) {
                echo 'values not equal';                
            } else {
                $companyId = $key2;
                break;
            }
        }

        $this->data['CompanyRanking'][$ranking]['ranking'] = $ranking;
        $this->data['CompanyRanking'][$ranking]['company_id'] = $companyId;
        $ranking++;
    }
}
cballou
Many thanks cballou. It turns out the trim() was working, but your code was much more efficient than mine.
gomezuk
+6  A: 

Try var_dump() instead of echo.

echo 'APPARENTLY '.$value2.' does not equal '.$value;   
echo '<pre>Debug: ';
echo 'value='; var_dump($value);
echo 'value2='; var_dump($value2);
echo '</pre>';

It provides additional information. E.g. the actual type. And the length of strings.

VolkerK
Especially useful when using var_dump is to make sure you have xdebug installed, as it will pretty up the output (things can be hard to read with the traditional echo, or, forbid, print_r).
Travis Leleu
+1  A: 

try trim() for any white space as well as var_dump() to see if anything else is being passed with it.

Phill Pafford
+2  A: 

Try to check encoding of both string compared.

maybe it is utf8 compared with iso-5589-1 with some weird chars.

Ismael