Re: strcmp() versus ==
| From: | Shawn McKenzie | Date: | Tue, 17 Mar 2009 17:53:23 +0000 |
| Subject: | Re: strcmp() versus == | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-290178@lists.php.net to get a copy of this message | ||
Clancy wrote:
> 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;
> }
Just a quick look, your original post was about comparing "strings" and
as far as I know, unless you force a string comparison the < and > will
do a numerical comparison, and even if I'm wrong, anything compared to
your 1 will be a numerical comparison. If your just trying to sort,
check out sort() and natsort().
--
Thanks!
-Shawn
http://www.spidean.com