Re: strcmp() versus ==
| From: | Clancy | Date: | Tue, 17 Mar 2009 09:34:59 +0000 |
| Subject: | Re: strcmp() versus == | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-290159@lists.php.net to get a copy of this message | ||
On Mon, 16 Mar 2009 17:06:35 -0500, nospam@mckenzies.net (Shawn McKenzie) wrote:
>Shawn McKenzie wrote:
>> Paul M Foster wrote:
>>> I had never completely read over the rules with regard to comparisons in
>>> PHP, and was recently alarmed to find that $str1 == $str2 might not
>>> compare the way I thought they would. Is it common practice among PHP
>>> coders to use strcmp() instead of == in making string comparisons? Or am
>>> I missing/misreading something?
>>>
>>> Paul
>>>
>>
>> I would use $str1 === $str2 if you want to make sure they are both
>> strings and both the same value.
>>
>> Since PHP is loosely typed, "0" == 0 is true however "0" === 0 is
>> false.
>>
>
>If you want to force a string comparison you can also use:
>
>(string)$str1 == (string)$str2
Recently there was some discussion about inexplicable results from sorting alphanumeric
strings. Inspired by your suggestion I filled in an array with random 4 character
alphanumeric strings, and then wrote a simple bubblesort. I made two copies of the array,
and sorted one using a simple comparison, and the other using the above comparison. The
initial values of the array were :
$aa = array
('ASDF','01A3','0A13',1,'00A3','ZZZZ','001A','0000','7205','00Z0');
(There are no letter 'O's in this),
And the results I got were:
Tb2_38: Original Raw comp String Comp
ASDF 0000 0000
01A3 00A3 001A
0A13 01A3 00A3
1 0A13 00Z0
00A3 ASDF 01A3
ZZZZ ZZZZ 0A13
001A 1 1
0000 001A 7205
7205 00Z0 ASDF
00Z0 7205 ZZZZ
Apart from the out of place '1', apparently treated as '1000', which I threw in
out of
curiosity, the string comparison gave the expected results, but I cannot see the logic of
the raw comparison. Can anybody explain these results?
Clancy
If anyone is suspicious the actual code I used was:
$aa = array
('ASDF','01A3','0A13',1,'00A3','ZZZZ','001A','0000','7205','00Z0');
$k = count ($aa); $bb = $aa; $cc = $aa;
while ($k > 1)
{
$i = 0; $j = 1; while ($j < $k)
{
if ($cc[$i] > $cc[$j])
{
$t = $cc[$i]; $cc[$i] = $cc[$j]; $cc[$j] = $t;
}
++$i; ++$j;
}
--$k;
}
$k = count ($aa);
while ($k > 1)
{
$i = 0; $j = 1; while ($j < $k)
{
if ((string)$bb[$i] > (string)$bb[$j])
{
$t = $bb[$i]; $bb[$i] = $bb[$j]; $bb[$j] = $t;
}
++$i; ++$j;
}
--$k;
}
echo '<p>Tb2_38: Original Raw comp
String Comp</p>';
$i = 0; $k = count ($aa);
while ($i < $k)
{
echo '<p>
'.$aa[$i].
' '.$cc[$i].
' '.$bb[$i].'</p>';
++$i;
}