2012-07-15 17 views
5

Ho fatto alcuni test con le stringhe usando '=='. So che confrontare la stringa '==' non è il modo, ma c'è un comportamento strano che voglio risolvere.Confronto di stringhe PHP usando '=='

Sto seguendo la documentazione di PHP in questa pagina: http://www.php.net/manual/en/language.operators.comparison.php. Questa è la prova che ho fatto

<?php 
    var_dump("100" == "1e2"); //outputs boolean true 
    var_dump((int) "100"); //int 100 
    var_dump((int) "1e2"); //int 1 
?> 

La documentazione dice che quando mettiamo a confronto le stringhe con i numeri, PHP prima converte la stringa di numeri, ma quando converto '100' e '1E2' di numeri che non sono uguali. Il confronto dovrebbe generare false booleane.

Perché questo strano comportamento? Grazie!

+0

Incidentalmente è per questo che di solito è meglio usare '===' invece di '==', poiché il risultato è molto più prevedibile! –

risposta

6

Non tutti i numeri sono numeri interi. 1e2 è un float (che è rappresentabile come un numero intero, ma non è direttamente trasformabile in un numero intero). Provare la conversione in float s anziché int s:

<?php 
    var_dump("100" == "1e2"); // bool(true) 
    var_dump((float) "100"); // float(100) 
    var_dump((float) "1e2"); // float(100) 
?> 
+1

Per espandere su questo, ecco la spiegazione nei documenti. http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion "Se la stringa non contiene nessuno dei caratteri". "," e "o" E 'e il valore numerico si adatta ai limiti del tipo intero (come definito da PHP_INT_MAX), la stringa verrà valutata come un numero intero, in tutti gli altri casi verrà valutata come float. " –

1

Type Juggling non è uguale a Type Casting

Nella pagina Tipo manipolazione

Se uno degli operandi è float, quindi entrambi gli operandi vengono valutati come galleggianti, e il risultato sarà un galleggiante. In caso contrario, gli operandi verranno interpretati come numeri interi e il risultato sarà anche un numero intero.