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/