Try this:

<?php

$a1 = “0d2”;

$a2 = “0d3”;

$b1 = “0e2”;

$b2 = “0e3″;

if ($a1 == $a2) print ‘$a1 == $a2’.”n”;

if ($b1 == $b2) print ‘$b1 == $b2’.”n”;

// In fact

if (“0e2” == “0e3″) print ‘”0e2” == “0e3″‘.”n”;

// But

if ($a1 === $a2) print ‘$a1 === $a2’.”n”;

if ($b1 === $b2) print ‘$b1 === $b2’.”n”;

if (“0e2” === “0e3″) print ‘”0e2” === “0e3″‘.”n”;

// I can cope with this behaviour for ==, even though it is strange,

// as php.net says:

// “If you compare two numerical strings, they are compared as integers.”

// However, php.net says

// $a == $b Equal: TRUE if $a is equal to $b.

// $a === $b Identical: TRUE if $a is equal to $b,

// and they are of the same type.

// Demonstrably, whatever type php decides the first argument is,

// it should be the same as the second.

// So === should have the same behaviour as ==

// Agreed? 🙂

// The worry is that the temptation is to use ===,

// but I really think that strcmp is the only true way.

// There must be shedloads of programs out there

// which use == for strcmp on input,

// but would break if the input looked like a small double

// (in case you hadn’t worked out why yet!).

// I think I’ll change my name to “0e1″ 🙂

// And before you ask

if ($a1 != $a2) print ‘$a1 != $a2’.”n”;

if ($b1 != $b2) print ‘$b1 != $b2’.”n”;

if ($a1 !== $a2) print ‘$a1 !== $a2’.”n”;

if ($b1 !== $b2) print ‘$b1 !== $b2’.”n”;

// So at least it is consistent.

?>

Which gives:

$b1 == $b2

“0e2” == “0e3”

$a1 != $a2

$a1 !== $a2

$b1 !== $b2