6
votes

Comparer deux chaînes identiques retournent false dans php

J'essaie de comparer deux chaînes. Lorsque je les faisons écho, ils semblent être identiques, mais lorsque je les comparais à l'opérateur '==', il renvoie False. Par exemple, lors de l'exécution du code ci-dessous sur ma base de données. Il génère des choses comme "apparemment Apple ne correspond pas à une pomme". Quelle est la raison? XXX


1 commentaires

Un canonique est comparaison de chaînes en utilisant '==' vs. strcmp () ' (les réponses couvrez également === ).


5 Réponses :


4
votes

Les chaînes ont-elles des espaces supplémentaires que vous ne voyez pas? Essayez de les couper.


4 commentaires

Dans une veine similaire, essayez d'utiliser echo 'apparemment>'. $ Value2. '< "$ valeur". qui illustrera également cela mieux.


Merci pour la suggestion. J'ai essayé d'ajouter "si (garniture ($ Value2)! = Garniture (valeur de $))" Et je suis toujours en train d'obtenir "Apparemment Apple ne correspond pas à la pomme".


Sur une autre note, mon code affiché ci-dessus serait plus rapide car vous n'effectuez pas la première garniture sur $ de valeur pour chaque itération de $ Company_array.


Il suffit de couper () ne suffit probablement pas parce qu'il ne fera que couper uniquement les espaces au début et à la fin des cordes.



3
votes

Je suis d'accord avec Olafur. J'ai supprimé la garniture et l'a remplacée par un preg_replace en raison du fait que vous supposez $ la valeur et $ Value2 sont des compagnies de société. Vous pouvez modifier rapidement ces modifications si la société est censée être alphanumérique, contenant des traits d'union, etc ... cette version doit le faire:

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++;
    }
}


1 commentaires

Merci beaucoup CLBLOU. Il s'avère que la garniture fonctionnait, mais votre code était beaucoup plus efficace que le mien.



10
votes

try var_dump () au lieu d'echo.

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


1 commentaires

Surtout utile lorsque vous utilisez Var_Dump consiste à vous assurer que vous avez installé Xdebug, car il sera jadis up de la sortie (les choses peuvent être difficiles à lire avec l'écho traditionnel ou, interdire, print_r).



3
votes

Essayez Garni () pour n'importe quel espace blanc ainsi que Var_Dump () pour voir si quelque chose d'autre est passé avec elle.


0 commentaires

4
votes

Essayez de vérifier le codage des deux cordes comparées.

Peut-être que c'est utf-8 par rapport à ISO 8859-1 avec des personnages étranges.


0 commentaires