/ 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
Foreach-løkker og referencer (&)
Fra : Bertel Lund Hansen


Dato : 29-06-11 07:39

Hej alle

Jeg er lige kommet af med en lusket bug i et script jeg har
arbejdet med. Jeg læste mig til i manualen at man kan undgå
kopiproblemet i en foreach-løkke [1] ved at bruge reference.

Efter mange trakasserier prøvede jeg at gå tilbage til en
tællerstyring og direkte tilgang til arrayet, og så virkede det.

Fejlen viste sig når jeg udskrev en liste, ved at der var en
linje mere end der burde være, de to sidste linjer var identiske
(bortset fra at sidste element var tomt), og den allersidste
post fra den indlæste fil var forsvundet.

Her er rutinerne. De skal tage et array af arrays som er indlæst
fra en include-fil, og for hvert hovedelement skal den poppe og
gemme sidste element, merge arrayet med flere værdier og til
sidst pushe det gemte element. Det skal resultere i at hoved-arrayet
er opdateret, og det var til den del jeg syntes at en reference
ville være smart.

Her er rutinen der giver fejl:

foreach ($residences as &$residence) {
   $addr=$residence[0];
   $manuals=$suppdata[$addr];
   if (!$manuals) $manuals=$empty;
   $mapid=array_pop($residence);
   array_push($manuals,$mapid);
   $residence=array_merge($residence,$manuals);
}

Og her en rutine der virker:

foreach ($residences as $nr => $residence) {
   $addr=$residence[0];
   $manuals=$suppdata[$addr];
   if (!$manuals) $manuals=$empty;
   $mapid=array_pop($residence);
   array_push($manuals,$mapid);
   $residences[$nr]=array_merge($residence,$manuals);
}


[1] Hvis man ikke ved hvad jeg mener med kopiproblemet, er her et
eksempel. Forestil dig at du har en prisliste hvor der skal
lægges moms på alle priserne:

   foreach ($priser as $pris) {
      $pris*=1.25;
   }

Det virker ikke. $priser er uændret efter den løkke fordi $pris
blot er en kopi. Her adresseres det oprindelige array direkte:

   foreach ($priser as $nr => $pris) {
      $priser[$nr]=$pris*1.25;
   }

Det virker.

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

 
 
Søg
Reklame
Statistik
Spørgsmål : 177417
Tips : 31962
Nyheder : 719565
Indlæg : 6407865
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste