在PHP中,比较两个完全相同的字符串会返回false。

6

我正在尝试比较两个字符串。当我打印它们时,它们看起来是相同的,但是当我使用“==”运算符进行比较时,它返回false。例如,在我的数据库上运行以下代码时,它输出类似于“显然,Apple不等于Apple”的内容。原因是什么?

if ($this->data['list_text']) { // The 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++;
    }
}

一个经典问题是 *使用'=='与'strcmp()'进行字符串比较*(答案也涵盖了===)。 - Peter Mortensen
5个回答

11

尝试使用var_dump()而不是echo。

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

它提供了额外的信息,例如实际类型和字符串的长度。


1
特别有用的是要确保安装了xdebug,这样在使用var_dump时可以使输出更加美观(传统的echo或print_r输出可能难以阅读)。 - Travis Leleu

4

这些字符串中是否有看不见的额外空格?尝试去除它们。


同样地,尝试使用 echo 'APPARENTLY >'.$value2.'< does not equal >'.$value.'<'; 这将更好地说明这一点。 - Matthew Scharley
谢谢您的建议。我尝试添加了 "if (trim($value2) != trim($value))",但仍然出现“显然 Apple 不等于 Apple”的错误。 - gomezuk
另外需要注意的是,我上面发布的代码会更快,因为您不需要在$company_array的每次迭代中都对$value执行第一次修剪操作。 - Corey Ballou
仅使用trim()可能不够,因为它只会修剪字符串开头和结尾的空格。 - markus

4

尝试检查比较的两个字符串的编码。

可能是使用UTF-8ISO 8859-1进行比较,其中包含一些奇怪的字符。


3

我同意Olafur的观点。由于您假设$value和$value2是公司ID,因此我删除了trim并将其替换为preg_replace。如果公司ID应该是字母数字、包含连字符等,则可以对这些进行快速修改...这个版本应该可以胜任:

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。原来trim()函数是有效的,但你的代码比我的更加高效。 - gomezuk

3

尝试使用trim()来清除任何空格,同时使用var_dump()查看是否还有其他内容传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接