Comparing strings (revisited)
| From: | Clancy | Date: | Mon, 25 May 2009 02:46:16 +0000 |
| Subject: | Comparing strings (revisited) | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-293097@lists.php.net to get a copy of this message | ||
For some time I have been working on a text based database, in which each entry contains
one or more lines of data, with the various fields delimited by semicolons, e.g.
A;b;20GM;;;;;Restaurant;090508
n;;;Arintji;;
a;Federation Square;;;
p;9663 9900;;;9663 9901;;info@arintji.com.au;
All was going well but recently I decided to allocate every entry a unique identifier,
and, in what with hindsight was clearly misguided enthusiasm, decided that each identifier
should be a four digit base 36 number (the 20GM in the first line). This did not cause any
problems until yesterday, when I tried to load a name beginning with 'R', and got the
first name on the list. When I investigated I found that I was searching the array
containing the data using:
if ($ident == $data[$i]['group']['ident']) { ......
I then found that I was searching for 20E2, but was getting a match on 2000. I tried
'if ((string) $ident == (string) $data[$i]['group']['ident'])',
but this still matched. However
'if($ident === '
worked, as did
'if (!strcmp($ident, $data[$i])) {...'.
After puzzling about this for a long time, I realised that the comparison process must
have been treating the second value as a floating point number, and converting it to
integer, or vice versa. (In floating point notation 20E2 = 20*10^^2 = 2000). I had
thought that the (string) override meant to treat the actual value as a string, but in
this case it must be converting the (assumed) actual value to a string, and then comparing
the results.
This surprised me considerably as it is clear from the results I achieve in other
circumstances that the data is actually stored as a raw string.
$data is a variable format array, and when the original data is read each line is exploded
into a term of the data array: $data[][] = explode(';',$line[$i]);. If I print the value
of the ident (or any other field) it is always shown as the original string, and when I
save an updated version of the data, each term of the data array is imploded into a line
of the data file in its original format. However if this value were actually converted to
a floating point number when it was entered I would have to specify a format before I
could write it out again, and as 20E2 is a rather non-standard format it is most unlikely
that it would come out as this unaided.
Is there any way to specify that each field is always to be treated as a string when I
originally explode the input file into the data array? For someone brought up on rigidly
defined data types dynamic typing can be very confusing!