2009-10-14 15 views
5

Esto está completamente más allá de mí. Estoy tratando de comparar dos cadenas. Cuando hago un eco de ellos, parecen ser idénticos, pero cuando los comparo con el operador '==', devuelve falso. Por ejemplo, cuando ejecuto el código a continuación en mi base de datos. Muestra cosas como "AL IGUAL QUE Apple no es igual a Apple". ¿Alguien puede aclarar esto?La comparación de dos cadenas idénticas devuelve falso en PHP

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

¿Qué dice strcmp()? –

Respuesta

2

Estoy de acuerdo con Olafur. Quité el recorte y lo reemplacé con un preg_replace debido al hecho de que está asumiendo $ value y $ value2 son companyIDs. Se puede hacer una rápida modificación de éstos si el CompanyID se supone que debe ser alfanumérico, contienen guiones, etc ... Esta versión debe hacerlo:

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

Muchas gracias cballou. Resultó que el ajuste() estaba funcionando, pero tu código era mucho más eficiente que el mío. – gomezuk

3

¿Las cadenas tienen espacio en blanco adicional que no está viendo? Intenta recortarlos.

+0

En una línea similar, intente usar 'echo 'APARENTEMENTE>'. $ Value2. ''. $ Value. '<';' Que también lo ilustrará mejor. –

+0

Gracias por la sugerencia. Intenté agregar "if (trim ($ value2)! = Trim ($ value))" y sigo recibiendo "APPARENTLY Apple no es igual a Apple". – gomezuk

+0

En otra nota, mi código publicado anteriormente sería más rápido ya que no realiza el primer ajuste en $ valor por cada iteración de $ company_array. –

9

var_dump Try() en lugar de eco.

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

Proporciona información adicional. P.ej. el tipo real Y la longitud de las cuerdas.

+1

Especialmente útil al usar var_dump es asegurarse de que tiene instalado xdebug, ya que mejorará bastante la salida (las cosas pueden ser difíciles de leer con el eco tradicional, o, prohibir, print_r). –

2

prueba trim() para cualquier espacio en blanco, así como var_dump() para ver si se está pasando algo más con él.

3

Intente verificar la codificación de ambas cadenas comparadas.

tal vez es utf8 en comparación con iso-5589-1 con algunos caracteres extraños.

Cuestiones relacionadas