On 2005-07-05, Bertel Lund Hansen <nospamfilius@lundhansen.dk> wrote:
> Nu har jeg lagt et lille modeleksempel frem. Alle klasserne og
> rutinerne er uændrede; det er kun datafilerne der er blevet
> barberet:
>
> Her kan man aktivere sin browser og se resultatet:
>
http://fiduso.dk/test/statistik.php
>
> Her ligger PHP-koden i en tekstfil:
>
http://fiduso.dk/test/statistik.txt
>
> De to reducerede datafiler:
>
http://fiduso.dk/test/medlem.dat
>
http://fiduso.dk/test/inifile.ini
Problemet ligger i din måde at bruge objekter på. I PHP4 er
standardmåden at håndtere objekter på med kopiering. Jeg kan se i koden,
at du er opmærksom på at videregive en del ting med referencer, så jeg
antager du har styr på forskellen på kopier og referencer.
I det aktuelle eksempel går det galt omkring linie 204:
foreach ($sexes as $s => $sex) {
$num=$sex->contains($name);
Løkken tager simpelthen kopier ud af arrayet fremfor referencer. En måde
at løse det på i det aktuelle eksempel er ved at tilgå array'et direkte:
foreach ($sexes as $s => $sex) {
$num=$sexes[$s]->contains($name);
Med denne konstruktion får du opdateret counteren som du ønsker.
Bemærk, at selve løkken principielt fungerer som den er kodet. De "to
returværdier" får du fordi du i hvert gennemløb laver et gennemløb for
begge sexes. Det ville nok være pænere at bruge en if-sætning i dette
tilfælde, da man må antage, at der ikke kommer flere køn på banen end
to.
Der er givetvis andre steder i din kode, hvor du vil være nødt til at
lave lignende krumspring, for at undgå at få kopier af dine objekter.
Derudover vil du muligvis have glæde af funktionen array_search(), jeg
bemærker, at du en del steder laver nogen foreach() ting med samme
effekt.
Endelig vil jeg råde dig til at skille dig af med dine globale variable.
Jeg kan se, at du en del steder bruger dem som konstanter, til dette
formål er define() normalt at foretrække, da du slipper for at erklære
noget globalt i dine funktioner og samtidig bliver det klarere, at det
er konstanter, du arbejder med.
--
Med venlig hilsen
- Jacob Atzen