On 18 October 2003 10:10, Wang Feng wrote:

> I can't uderstand why the number 18 is stored in the $third
> rather than
> $first. I tried to change the 18 to "18", that is, change it
> from a decimal
> number to a string and by that way, "18" is stored in the $first,
> which is what I expected. But why doesn't 18 work?
> 
> My understanding is that the compiler checks the ascii set
> when it deals
> with sorting. So, why the number 18 is *greater* than string "blue"
> and "large" in the ascii?

This is all to do with how PHP handles comparison of different types to each other.

When that sort is run on

    array("large", "blue", 18.00)

the comparison of "large" to "blue" is fine, because both are strings so there's no 
type conversion involved.  However, the comparison of 18.00, a number, to either 
"blue" or "large", both strings, necessarily involves a type conversion, and the rules 
PHP uses says that when comparing a number with a string, the string should be 
converted to a number and teh comparison performed using the two numbers -- and both 
"blue" and "large", when converted to a number, are represented by 0, which sorts 
before 18, so bingo!

Now, if you make the array into

    array("large", "blue", "18.00")

then all the comparisons are string-ti-string, so there are no type conversions 
involved, so your sort proceeds exactly how you expect.

If you wish to sort an array containing values of more than one type, then you must 
either be fully aware of these type-conversion rules and accept the slightly odd 
results they will sometimes give you, or use one of the optional sort flags -- 
SORT_STRING or SORT_NUMERIC -- to force a more uniform comparison.  But don't forget 
that if you use SORT_STRING and have an array containing numbers, you will get a 
textual sort of those numbers -- for example: 1, 5, 33, 297 would sort as "1", "297", 
"33", "5"!!

Cheers!

Mike

---------------------------------------------------------------------
Mike Ford,  Electronic Information Services Adviser,
Learning Support Services, Learning & Information Services,
JG125, James Graham Building, Leeds Metropolitan University,
Beckett Park, LEEDS,  LS6 3QS,  United Kingdom
Email: [EMAIL PROTECTED]
Tel: +44 113 283 2600 extn 4730      Fax:  +44 113 283 3211 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to