[ VladaSu @ 20.09.2011. 22:55 ] @
Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true

$ip = '127.1.1.1';
echo $ip == intval($ip); // false
 


I kada sam prijavio bug dobio sam odgovor da to nije bug i da treba da procitam manual.

Uopste mi nije jasno kojom logikom radi. Oba slucaja MORAJU da daju false.
[ Zlatni_bg @ 20.09.2011. 23:28 ] @
Ne bi trebalo da bude false, jer ti "==" automatski konvertuje promenljivu iz stringa u integer pri poredjenju. Samim tim, 127 = 127 u prvom slucaju. Ne znam zasto i u drugom slucaju nije true, moje misljenje je da ima veze sa zaokruzivanjem.

http://php.net/manual/en/function.intval.php - ovde mozes naci dosta informacija :)

[Ovu poruku je menjao Zlatni_bg dana 21.09.2011. u 00:39 GMT+1]
[ VladaSu @ 21.09.2011. 11:39 ] @
Izgleda da nije problem u intval nego u ==.
Posto je sa jedne strane integer PHP sa druge strane da stavi broj pa uradi prvo float pa int.
i onda se dodje na :
Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true
//radi ovo posto je sa desne strane int
echo floatval($ip) == intval($ip); // jos uvek false ali ce da pokusa int u sledecem koraku
echo intval($ip) == intval($ip); // i dobije se true
 


druga ip gde nije 0 drugi broj
Code (php):

$ip = '127.1.1.1';
echo $ip == intval($ip); // true
//radi ovo posto je sa desne strane int
echo floatval($ip) == intval($ip); // jos uvek false ali ce da pokusa int u sledecem koraku
echo intval($ip) == intval($ip); // intval nije prosao
 


[ maksvel @ 21.09.2011. 11:56 ] @
Ako izbacimo intval i stavimo samo brojeve, imamo:

Code:

<?php
$ip = '127.0.1.1';

echo  $ip==127;

$ip='127.1.1.1';

echo $ip==127;

?>


Ovo daje isto kao i kod u inicijalnom postu. Na php.net piše da se kod operatora == promenljive postavljaju na zajednički tip (ovde valjda integer), ali biće da uzima decimalu iza tačke, tj u prvom slučaju 127.0, a u drugom 127.1.
Kao da rezultat intval pri poređenju tretira kao floatval.
[ Zlatni_bg @ 21.09.2011. 12:28 ] @
Pa cak i da uzima float, trebalo bi u oba slucaja da daje true...
[ maksvel @ 21.09.2011. 12:48 ] @
Nagađam, ali mi se čini da za 127.0 konta da je isto što i 127, a za 127.1 da nije.
[ VladaSu @ 21.09.2011. 13:50 ] @
Citat:
maksvel: Nagađam, ali mi se čini da za 127.0 konta da je isto što i 127, a za 127.1 da nije. :)


Pa 127 je jednako sa 127.0 ali je problem kako dodje do 127.0.
Cim je sa leve strane pretvorio 127.0.1.1 u 127.0 treba da konta da to nije to i da stane.
Drugo je da sam imao 127.0 kao string i on ga pretvorio u 127.0 kao broj pa to je isto i onda moze dalje da poredi.
[ Zlatni_bg @ 21.09.2011. 17:27 ] @
Ali radi se o tome da uopste ne treba da radi sa float vrednostima, trebalo bi sve da konveruje u integer posto je "intval" funkcija iskoriscena u poredjenju... a i kako god da poredi, poredi 2 iste vrednosti koje se konvertuju opet na ISTI nacin, tako da bi trebalo da daju iste konvertovane vrednosti... ako ima neko logicno objasnjenje za ovaj drugi slucaj bilo bi lepo da se javi.. :)
[ vilyu @ 21.09.2011. 23:02 ] @
Zaista i piše u manual-u objašnjenje za ovakvo ponašanje:

String conversion to numbers
Citat:
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.

Type Juggling
Citat:
If either operand is a float, then both operands are evaluated as floats, and the result will be a float.

Što će reći da se string 127.1.1.1 konvertuje u float jer sadrži tačku, a zatim se u poređenju sa int-om int konvertuje u float. Dakle, dešava se:
1) '127.1.1.1' == 127
2) 127.1 == 127
3) 127.1 == 127.0
=>false
[ VladaSu @ 21.09.2011. 23:32 ] @
Da, ali ja nisam radio matemtaicku operaciju po kojoj je on mogao da zakljuci da li ja radim sa brojevima ili stringovima
jer nema matemtaickih operacija sa stringovima.
Radio sam operaciju poredjenja i to je moguce sa stringovima.
Ne znam na koji nacin sam ga naveo da on razmislja sa float-ovima.
[ Marko Medojević @ 22.09.2011. 13:57 ] @
Kod:
Code:

$ip1 = '127.0.1.1';
$ip2 = '127.1.1.1';

echo (double)$ip1 . "\n";
echo (double)$ip2 . "\n";


Output:

127.0
127.1
[ omega_bg88 @ 22.09.2011. 14:31 ] @
Nevezano da li se radi o aritmetičkoj ili logičkoj operaciji između stringa i broja (int ili float), sa stringom se dešava sledeće:
- ako sadrži broj na svom početku, biva cast-ovan u int
- ako sadrži broj iza koga sledi na početku iza koga se nalazi '.' , biva cast-ovan u float
- ako sadrži bilo koji drugi karakter na početku, tretira se kao 0

Npr.

'2' + 2 = 4;
'2.5' + 2 = 4.5;
'.5' + 1 = 1.5;
'2somestring' + 2 = 4;
'somestring' + 2 = 2;

[Ovu poruku je menjao omega_bg88 dana 22.09.2011. u 19:58 GMT+1]
[ ImPlant @ 10.10.2011. 21:04 ] @
nije bug, vilyu je lepo objasnio zasto takav rezultat.

za sta ti ovo tacno treba?

da bi se osigurao eksplicitno kastuj i levu stranu u int

Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true

$ip = '127.1.1.1';
echo (int)$ip == intval($ip); // true
 


ili mozda jos bolje da koristis sledecu proveru (da li $ip pocinje sa 127)

Code (php):

\strpos($ip, '127') === 0
 

PS. obavezno koristi === da ne bi dobio lazno tacno poredjenje
[ VladaSu @ 11.10.2011. 10:26 ] @
Meni ne treba da je 127 jednako sa 127 nego da je 127 razlicito od 127.0.0.1.
Tako da (int) ili === mi nista ne znaci.
Nije mi logicno da on sam pretvara string u integer. Logicnije mi je da integer pretvori u string prilikom poredjenja jer se pri takvom poredjenju sadrzaj varijabli ne menja.

Resio sam tako sto sam mu naredio da je onaj intval string.