2012-02-13 15 views
6

Pracowałem nad kodem przetwarzania danych podczas natknąłem się na następujące.Weird PHP String Integer Porównanie i konwersja

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

var_dump($line == $key); 

Więc większość z nas spodziewa zrzut do wytworzenia false, ale ku mojemu zdziwieniu wysypisko było true!

rozumiem, że w PHP istnieje rodzaj konwersji tak:

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

Ale dlaczego porównanie jak jak wspomniałem w pierwszym przykładzie konwertuje mój ciąg do liczby całkowitej zamiast konwersji integer na string.

rozumiem, że można zrobić === ścisłego-porównania na moim przykładzie, ale po prostu chcę wiedzieć:

  • Czy istnieje jakakolwiek część dokumentacji PHP, wymieniając na to zachowanie?
  • Czy ktoś może wyjaśnić, dlaczego dzieje się w PHP?
  • Jak programiści mogą zapobiegać takim problemom?
+0

== robi porównanie numeryczne, które myślę, a kiedy bierzesz i ciągasz i konwertujesz na liczbę, jeśli zaczyna się od liczby, używa tego numeru. Jeśli prawdopodobnie nie zwróci czegoś takiego jak NaN. – rubixibuc

+0

Większość z nas oczekiwałaby tego ....podczas rzucania łańcucha do liczby całkowitej (jak to się dzieje podczas porównywania łańcucha z liczbą), PHP zatrzymuje się na pierwszej nie numerycznej cyfrze, którą napotka, w tym przypadku na przestrzeni między 100 (wszystkie cyfry) i "coś". SO 100 jest wypadkową wartością. –

+0

Zobacz http://strefa.com.pl/a/8672423 – Gumbo

Odpowiedz

4

Jeśli ponumeruję poprawne PHP "rzuca" dwie zmienne do najniższego możliwego typu. Nazywają to żonglowaniem typem.

spróbuj: var_dump("something" == 0); na przykład, że da ci to prawda. . raz mnie to ugryzło.

Więcej informacji: http://php.net/manual/en/language.operators.comparison.php

+0

Instrukcja PHP opisuje teraz typowanie żonglowania na http://php.net/manual/en/language.types.type-juggling.php, który z kolei prowadzi do sekcji o zamianie ciągów na liczby na http://php.net/manual /en/language.types.string.php#language.types.string.conversion –

1

wiem, że to jest już odpowiedział i zaakceptowane, ale chciałem dodać coś, co może pomóc innym, którzy znaleźli go poprzez wyszukiwanie.

Miałem ten sam problem, gdy porównywałem tablicę postów z kluczami w tablicy PHP, gdzie w tablicy postów miałem dodatkową wartość ciągu.

$_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"; 
     } 
    } 
} 

Z tego można by pomyśleć, że na koniec $foo[0]["bar"] byłaby równa "0" ale co się dzieje, jest to, że kiedy $key = int 0 została luźno porównywane $bar = string "other" wynik był true aby rozwiązać ten problem, ja ściśle porównywane, ale wtedy konieczna przekonwertować $key = int 0 w $key = string "0", gdy tablica pO zdefiniowano jako array("other","0"); Poniżej przepracowanych:

$_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"; 
     } 
    } 
} 

w rezultacie $foo[0]["bar"]="1" jeśli "0" był w tablicy słupków POST i $foo[0]["bar"]="0", jeśli "0" nie znajdował się w tablicy słupków POST.

Pamiętaj, że podczas porównywania zmiennych Twoje zmienne mogą nie być porównywane, jak myślisz, z powodu luźnego wpisywania zmiennych PHP.

+0

Może to tylko ja, ale twój przykład jest zbyt zawiły dla jego własnego dobra. Wydaje się, że problem polega na tym, że definiujesz '$ foo' jako tablicę asocjacyjną zagnieżdżoną w regularnej tablicy, ale następnie użyj asocjacyjnego wyrażenia tablicowego' ($ key => $ data) 'do parsowania zwykłej tablicy. Jeśli musisz mieć to zagnieżdżenie w danych, dlaczego nie zagnieżdżasz tej pętli w innej, która obsłuży zwykłą tablicę? –