2012-02-13 24 views
6

Estaba trabajando en algún código de análisis de datos mientras me encontraba con lo siguiente.Comparación y conversión enteras de String PHP String

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

bien la mayoría de nosotros podría esperar que el vertedero para producir un false, pero para mi sorpresa el vertedero fue un true!

entiendo que en PHP no es el tipo de conversión de esa manera:

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

Pero por qué una comparación como la forma en que he mencionado en el primer ejemplo se convierte mi cadena a entero en lugar de convertir el entero a cadena.

entiendo que se puede hacer una comparación estricta-=== a mi ejemplo, pero sólo quiero saber:

  • ¿Hay alguna parte de la documentación de PHP mencionar en este comportamiento?
  • ¿Alguien puede dar una explicación de por qué está sucediendo en PHP?
  • ¿Cómo pueden los programadores evitar tal problema?
+0

== Creo que hace una comparación numérica, y cuando la toma y la encadena y la convierte en un número si comienza con un número, usa ese número. Si probablemente no devuelve algo como NaN. – rubixibuc

+0

La mayoría de nosotros esperaríamos esto ....al convertir una cadena en un número entero (como ocurre al comparar una cadena con un número), PHP se detiene en el primer dígito no numérico que encuentra, en este caso el espacio entre 100 (todos los dígitos) y "algo". SO 100 es el valor resultante. –

+0

Ver http://stackoverflow.com/a/8672423 – Gumbo

Respuesta

4

Si recalco correctamente, PHP 'arroja' las dos variables al tipo más bajo posible. Lo llaman tipo malabares.

prueba: var_dump("something" == 0); por ejemplo, eso te dará la verdad. . Me había mordido una vez antes.

Más información: http://php.net/manual/en/language.operators.comparison.php

+0

El manual de PHP ahora describe el malabarismo de tipos en http://php.net/manual/en/language.types.type-juggling.php, que a su vez lo vincula a una sección sobre conversión de cadenas a números en http://php.net/manual /en/language.types.string.php#language.types.string.conversion –

1

Sé que esto ya está contestada y aceptada, pero quería añadir algo que puede ayudar a otros que se encuentran a través de esta búsqueda.

Tuve el mismo problema cuando estaba comparando una matriz posterior a las claves en una matriz de PHP, donde en mi matriz posterior, tenía un valor de cadena adicional.

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

A partir de este se podría pensar que al final $foo[0]["bar"] sería igual a "0" pero lo que estaba sucediendo es que cuando $key = int 0 se comparó sin apretar contra $bar = string "other" el resultado fue true de solucionar este problema, me estrictamente en comparación, pero luego necesita para convertir el $key = int 0 en un $key = string "0" para cuando la matriz de POST se definió como array("other","0"); los siguientes funcionó:

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

el resultado fue $foo[0]["bar"]="1" si "0" estaba en la matriz de barra POST y $foo[0]["bar"]="0" si "0" no estaba en la matriz de barras POST.

Recuerde que al comparar variables, es posible que sus variables no se comparen como cree debido al tipado variable de PHP.

+0

Tal vez sea solo yo, pero su ejemplo es demasiado enrevesado por su propio bien. El problema parece ser que define '$ foo' como una matriz asociativa anidada dentro de una matriz regular, pero luego utiliza la expresión de matriz asociativa' ($ clave => $ datos) 'para analizar la matriz regular. Si tiene que tener esta anidación en los datos, ¿por qué no anidar ese bucle dentro de otro que manejaría la matriz regular? –

Cuestiones relacionadas