/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Sammenligning af to tal i strengformat - e~
Fra : Bertel Lund Hansen


Dato : 13-11-05 22:59

Hej alle

Jeg havde brug for at sammenligne to tal. Jeg skal finde det postnummerområde som et givet nummer tilhører, og jeg har til det brug oprettet et array med egnsnavn og minimumsgrænsen. Det ser sådan ud:

Postnummeregne:
København,1000
Nordsjælland,3000
Bornholm,3700
Sjælland med øer,4000
Fyn med øer,5000
Sydjylland,6000
Midtjylland,7000
Østjylland,8000
Nordjylland,9000
Udlandet,10000
Ikke oplyst,100000

Jeg kører så gennem posterne indtil minimumsgrænsen er større end
det aktuelle postnummer. Det så sådan ud (i barberet tilstand):

   if ($zipcode!=NOINFO) {
      $pn=0;
      foreach ($postnregne as $pn => $pnegn)
*         if ($pnegn->min_nr>$zipcode) break;
      ++$postnregne[$pn-1]->bor; // Nummeret tilhører den foregående egn.
   }

Det gav imidlertid fejl ved et svensk postnummer (26024) idet det
blev registreret som København. Det ses at Nordsjælland har et
minimum på 3000 som åbenbart blev regnet for større end 26024.
Et opslag i manualen siger at to numeriske strenge der
sammenlignes, sammmenlignes som heltal, men da jeg skrev sådan
i stedet for:

*         if (((int) $pnegn->min_nr)>((int) $zipcode)) break;

virkede det - altså skulle der et explicit cast til.

Er det en bug i PHP 4.3.9?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

 
 
Peter Brodersen (14-11-2005)
Kommentar
Fra : Peter Brodersen


Dato : 14-11-05 02:09

On Sun, 13 Nov 2005 22:58:49 +0100, Bertel Lund Hansen
<nospamfilius@lundhansen.dk> wrote:

>Et opslag i manualen siger at to numeriske strenge der
>sammenlignes, sammmenlignes som heltal, men da jeg skrev sådan
>i stedet for:
>
>*         if (((int) $pnegn->min_nr)>((int) $zipcode)) break;
>
>virkede det - altså skulle der et explicit cast til.

Her lader det til at virke fint:

$ php4 -r 'var_dump("26024" > "3000", 26024 > 3000);'
bool(true)
bool(true)

$ php5 -r 'var_dump("26024" > "3000", 26024 > 3000);'
bool(true)
bool(true)

Men: (bemærk mellemrummet)

$ php4 -r 'var_dump("26024 " > "3000");'
bool(false)
$ php5 -r 'var_dump("26024 " > "3000");'
bool(false)

Kan du lokkes til at prøve følgende:
   var_dump($pnegn->min_nr, $zipcode);
... og poste det præcise output her?

Det kan tænkes, at der har sneget sig et blanktegn ind et sted eller
lignende.

--
- Peter Brodersen

Peter Brodersen (14-11-2005)
Kommentar
Fra : Peter Brodersen


Dato : 14-11-05 02:12

On Mon, 14 Nov 2005 02:09:19 +0100, Peter Brodersen
<usenet2005@ter.dk> wrote:

>Det kan tænkes, at der har sneget sig et blanktegn ind et sted eller
>lignende.

... lidt gætværk, men hvis du bruger file() til at læse en fil ind i et
array for hver linje, så bemærk at hvert element stadigvæk har en
newline i enden.

Det kan så give følgende resultat:

$ php5 -r 'var_dump("26024\n" > "3000");'
bool(false)

--
- Peter Brodersen

Bertel Lund Hansen (14-11-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-11-05 02:53

Peter Brodersen skrev:

> .. lidt gætværk, men hvis du bruger file() til at læse en fil ind i et
> array for hver linje, så bemærk at hvert element stadigvæk har en
> newline i enden.

Ja, det kender jeg godt. Jeg bruger også trim() til at fjerne den
slags, men det var faktisk et hårdt mellemrum der hang ved.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (14-11-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-11-05 02:21

Peter Brodersen skrev:

>>Et opslag i manualen siger at to numeriske strenge der
>>sammenlignes, sammmenlignes som heltal, men [...]

> Her lader det til at virke fint:

> $ php5 -r 'var_dump("26024" > "3000", 26024 > 3000);'
> bool(true)
> bool(true)

> Men: (bemærk mellemrummet)
>
> $ php4 -r 'var_dump("26024 " > "3000");'
> bool(false)
> $ php5 -r 'var_dump("26024 " > "3000");'
> bool(false)

Dér var den. Tak for hjælpen.

> Kan du lokkes til at prøve følgende:
>    var_dump($pnegn->min_nr, $zipcode);
> .. og poste det præcise output her?

Det var det der afslørede kalamiteten.

> Det kan tænkes, at der har sneget sig et blanktegn ind et sted
> eller lignende.

Det var lige det.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177517
Tips : 31968
Nyheder : 719565
Indlæg : 6408629
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste