/ 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
Mystisk problem med selvudvidende array
Fra : Bertel Lund Hansen


Dato : 15-05-07 14:48

Hej alle

Nu er jeg (igen) på herrens mark. Det drejer sig om denne side:

   http://www.obese.dk/tidspunkt.php

Jeg har et sæt datoer som brugerne kan sætte mærker ved: nej,
måske og ja. Svarene kodes som henholdsvis 0, 1 og 2. Det giver
en svarfil der ser ud som følger, hvor NN er navnet, og de tre
store bogstaver er afsenderdomænet, og det isolerede 0 er
ligegyldigt i denne her sammenhæng.

NN1,XXX,0,2 2 0 0 2 2 2 2 2 2 2 2 2
NN2,YYY,0,2 2 2 2 0 1 0 1 2 2 2 2 2
NN3,,0,1 1 2 2 0 1 1 0 1 0 1 1 1
NN4,ÆÆÆ,0,2 2 2 2 2 2 2 2 2 2 2 2 2

Resultaterne præsenterer jeg i tabellen nederst til højre. I
testfasen har jeg tilføjet feltet "size" der burde være 4 i alle
tilfælde, men det er 6 i den sidste linje, og der er problemet.

Fremgangsmåden er at jeg opretter et array af arrays med fire
pladser ($time_scores) som bruges til nej, måske, ja og (senere)
samlet score. Det er de 4 felter som ikke må blive til 6.

Jeg gennemløber hver linje og udtrækker variablen $choices som er
striben af talsvar. Den eksploderer jeg til arrayet $ican som
jeg gennemløber og for hver værdi opdaterer jeg data for den
tilsvarende dato. Jeg beregner også en samlet score, men den del
er fjernet af koden her for at forenkle den.

Det virker perfekt på alle datoerne - undtagen lige den sidste.
Man kan se den korrekte score 7, men ved siden af står både Ja
og Måske til 0, og de burde være 3 og 1. Størrelsen på
$time_scores[$nr] står til 4 lige indtil sidste linje hvor den
er vokset til 6. Det viser sig at der er skudt to 0'er ind
forrest i $time_scores[12] (sidste post).

Hvis jeg hægter et mellemrum på datalinjerne til sidst, bliver
den sidste egentlige dato skrevet korrekt, men så dukker der en
ny linje op med et 0. Hvis jeg hægter et komma på datalinjerne
til sidst, virker alting rigtigt (jeg eksploderer dem tidligere
i koden efter kommaer).

Det mest mærkelige er at jeg bruger næsten samme princip på denne
her side:

   http://www.obese.dk/rejsemaal.php

men der er ingen problemer.


Her er hele koden til den ramme det drejer sig om. $filecontent
er det array der indeholder linjerne læst ind fra filen:

<div class='bredspalte'>
<table cellspacing='0' cellpadding='5'>
<tr><td>&nbsp;</td><th>Samlet score</th><th>Ja</th><th>Måske</th><th>size of array:</th></tr>
<?
$time_scores=Array();
for ($nr=0; $nr<$datenumber; ++$nr) $time_scores[]=Array(0,0,0,0);
$max=-1;
foreach ($filecontent as $entry) {
   list ($nam,$host,$lock,$choices)=explode(',', $entry);
   $icans=explode(' ',$choices);
   foreach ($icans as $nr => $ican) {
      ++$time_scores[$nr][$ican]; // Denne linje producerer fejlen.
      // Hvis jeg kommenterer den ud, bliver size ved med at være 4.
   }
}

foreach ($time_scores as $nr => $time_score) {
   list($no,$may,$yes,$score)=$time_score;
   echo "<tr><td>$time_choices[$nr]</td><td>$score</td><td>$yes</td><td>$may</td><td>".count($time_score)."</td></tr>\n";
}
?>
</table>
</div>      <!-- class 'bredspalte' -->


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

 
 
Bertel Lund Hansen (15-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 15-05-07 18:21

Bertel Lund Hansen skrev:

> Nu er jeg (igen) på herrens mark.

Problemet viste sig at hænge sammen med at der hang et blanktegn
i slutningen af linjen. Jeg tror at det er et spørgsmål om at
linjeskift+retur ikke er det samme som "\n".

Nu er det i hvert fald løst med trim også ved læsningen hvor jeg
før kun trimmede ved skrivning og troede at det var godt nok.

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

Peter Brodersen (15-05-2007)
Kommentar
Fra : Peter Brodersen


Dato : 15-05-07 19:27

On Tue, 15 May 2007 19:21:18 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Problemet viste sig at hænge sammen med at der hang et blanktegn
>i slutningen af linjen. Jeg tror at det er et spørgsmål om at
>linjeskift+retur ikke er det samme som "\n".

Nu er jeg ikke sikker på, hvad du mener med linjeskift.

- Linjeskift i textareas i forms medsender rigtigt nok \r\n (CR LF)
Det er i øvrigt, i modsætning til hvad nogle tror, uafhængigt af
operativsystem

- linjeskift (LF) og vognretur (CR) er rigtigt nok to forskellige
tegn. LF er "\n" og CR er "\r".

>Nu er det i hvert fald løst med trim også ved læsningen hvor jeg
>før kun trimmede ved skrivning og troede at det var godt nok.

Det kommer så an på, hvordan du importerer. Hvis du læser en rå fil og
splitter på tegnet "\n", så vil "Foo\r\nBar" rigtigt nok blive
splittet op til "Foo\r" og "Bar".

trim() trimmer i øvrigt kun i starten og slutningen af filen. Så hvis
du efterfølgende splitter filen, kan der opstå nye blanktegn i enden
af de enkelte nye elementer.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (15-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 15-05-07 19:38

Peter Brodersen skrev:

>>Nu er det i hvert fald løst med trim også ved læsningen hvor jeg
>>før kun trimmede ved skrivning og troede at det var godt nok.

> Det kommer så an på, hvordan du importerer. Hvis du læser en rå fil og
> splitter på tegnet "\n", så vil "Foo\r\nBar" rigtigt nok blive
> splittet op til "Foo\r" og "Bar".

Det var det der skete.

> trim() trimmer i øvrigt kun i starten og slutningen af filen. Så hvis
> du efterfølgende splitter filen, kan der opstå nye blanktegn i enden
> af de enkelte nye elementer.

De andre splitninger bruger mellemrum som skilletegn inden for
samme linje.

Tak for forklaringen.

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

Dennis Munding (15-05-2007)
Kommentar
Fra : Dennis Munding


Dato : 15-05-07 18:47

Hej Bertel!
"Bertel Lund Hansen" skrev i en meddelelse:
> Nu er jeg (igen) på herrens mark. Det drejer sig om denne side:

Jeg kan desværre ikke hjælpe dig (er også ligegyldigt - du har jo selv løst
problemet...), men...

[SNIP]

> for ($nr=0; $nr<$datenumber; ++$nr) $time_scores[]=Array(0,0,0,0);

....er der ikke en skrivefejl i ovenstående linje??
Skal det ikke være:
for ($nr=0; $nr<$datenumber; $nr++) $time_scores[]=Array(0,0,0,0);

Bemærk at jeg har flyttet plus-tegnene...

Jeg spørger blot for at teste min egen begrænsede php-viden...


Med venlig hilsen
--
Dennis Munding
http://tolkecentret.dk/ - Tolkning, oversættelse, rådgivning og kurser!
http://pe-vagtservice.dk/ -Et sikkert valg til at passe på dine værdier!
http://munding-webdesign.dk/ -Vi ses! - ganske enkelt...


ShutEye (15-05-2007)
Kommentar
Fra : ShutEye


Dato : 15-05-07 20:54

> [SNIP]
>
>> for ($nr=0; $nr<$datenumber; ++$nr) $time_scores[]=Array(0,0,0,0);
>
> ...er der ikke en skrivefejl i ovenstående linje??
> Skal det ikke være:
> for ($nr=0; $nr<$datenumber; $nr++) $time_scores[]=Array(0,0,0,0);

Forskellen:
http://www.php.net/manual/en/language.operators.increment.php



Bertel Lund Hansen (16-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 16-05-07 05:42

ShutEye skrev:

>> for ($nr=0; $nr<$datenumber; ++$nr) $time_scores[]=Array(0,0,0,0);

> ...er der ikke en skrivefejl i ovenstående linje??

Nej.

> Skal det ikke være:
> for ($nr=0; $nr<$datenumber; $nr++) $time_scores[]=Array(0,0,0,0);

Ikke skal, men kan.

Det er sandsynligvis ligegyldigt (fordi compieren optimerer), men
hvis der er en forskel, er ++$nr hurtigere. Ved ++$nr opdateres
variablen med det samme, og andet er der ikke i det. Ved $nr++
skal man have adgang både til den gamle og den opdaterede værdi.

Jeg bruger naturligvis ikke ++$nr kritikløst. Hvis jeg skulle
gennemløbe to datasæt ved f.eks. en kopiering, kunne jeg skrive
sådan:

   $newvalue[$nr]=$oldvalue[$nr++];

Den går i fisk hvis man skriver ++$nr.

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

ShutEye (16-05-2007)
Kommentar
Fra : ShutEye


Dato : 16-05-07 10:59

Jeg kender godt forskellen :)



Dennis Munding (17-05-2007)
Kommentar
Fra : Dennis Munding


Dato : 17-05-07 11:12

Hej Bertel!
"Bertel Lund Hansen" skrev i en meddelelse:
>> ...er der ikke en skrivefejl i ovenstående linje??
>
> Nej.

Ok!

>> Skal det ikke være:
>> for ($nr=0; $nr<$datenumber; $nr++) $time_scores[]=Array(0,0,0,0);
>
> Ikke skal, men kan.
>
> Det er sandsynligvis ligegyldigt (fordi compieren optimerer), men
> hvis der er en forskel, er ++$nr hurtigere. Ved ++$nr opdateres
> variablen med det samme, og andet er der ikke i det. Ved $nr++
> skal man have adgang både til den gamle og den opdaterede værdi.
>
> Jeg bruger naturligvis ikke ++$nr kritikløst. Hvis jeg skulle
> gennemløbe to datasæt ved f.eks. en kopiering, kunne jeg skrive
> sådan:
>
> $newvalue[$nr]=$oldvalue[$nr++];
>
> Den går i fisk hvis man skriver ++$nr.

Mange tak for forklaringen på dansk - der er jo en logisk begrundelse bag -
det var rart!
Så blev jeg også lidt klogere i dag...


Med venlig hilsen
--
Dennis Munding
http://tolkecentret.dk/ - Tolkning, oversættelse, rådgivning og kurser!
http://pe-vagtservice.dk/ -Et sikkert valg til at passe på dine værdier!
http://munding-webdesign.dk/ -Vi ses! - ganske enkelt...


Dennis Munding (17-05-2007)
Kommentar
Fra : Dennis Munding


Dato : 17-05-07 11:09

Hej!
"ShutEye" skrev i en meddelelse:
> Forskellen:
> http://www.php.net/manual/en/language.operators.increment.php

Mange tak for linket!
Selv om det (stadig) står på engelsk, så må jeg indrømme, at det er en af de
meget få sider på engelsk, som jeg har fået noget ud af at læse!


Med venlig hilsen
--
Dennis Munding
http://tolkecentret.dk/ - Tolkning, oversættelse, rådgivning og kurser!
http://pe-vagtservice.dk/ -Et sikkert valg til at passe på dine værdier!
http://munding-webdesign.dk/ -Vi ses! - ganske enkelt...


ShutEye (17-05-2007)
Kommentar
Fra : ShutEye


Dato : 17-05-07 11:45

>> Forskellen:
>> http://www.php.net/manual/en/language.operators.increment.php
>
> Mange tak for linket!
> Selv om det (stadig) står på engelsk, så må jeg indrømme, at det er en af
> de meget få sider på engelsk, som jeg har fået noget ud af at læse!

Tjekkede lige php.net for en dansk version:
http://www.php.net/manual/da/language.operators.increment.php
LOL! Sikken 'oversættelse' :)
Godt du kunne få noget ud af det på engelsk.



Dennis Munding (17-05-2007)
Kommentar
Fra : Dennis Munding


Dato : 17-05-07 14:33

Hej igen!
"ShutEye" skrev i en meddelelse:
> Tjekkede lige php.net for en dansk version:
> http://www.php.net/manual/da/language.operators.increment.php
> LOL! Sikken 'oversættelse' :)
> Godt du kunne få noget ud af det på engelsk.

Ja, det er netop mit store problem - de såkaldte "danske" versioner, er i
bund og grund slet ikke oversat - for det meste er det kun overskrifterne,
som er blevet oversat...

OT:
Et godt eksempel på dårlig oversættelse, kan du finde på countrysangeren
Kenny Rogers hjemmeside - du skal klikke dig ind i webshoppen - her har de
vist brugt en service på nettet til at oversætte:

save = gem (ikke helt forkert, meeeeen....)

når der nu menes, at man kan *spare* penge, så hænger den oversættelse ikke
rigtig sammen længere...


Med venlig hilsen
--
Dennis Munding
http://tolkecentret.dk/ - Tolkning, oversættelse, rådgivning og kurser!
http://pe-vagtservice.dk/ -Et sikkert valg til at passe på dine værdier!
http://munding-webdesign.dk/ -Vi ses! - ganske enkelt...


ShutEye (17-05-2007)
Kommentar
Fra : ShutEye


Dato : 17-05-07 14:56

> save = gem (ikke helt forkert, meeeeen....)
>
> når der nu menes, at man kan *spare* penge, så hænger den oversættelse
> ikke rigtig sammen længere...

Hvis du gemmer dem i en krukke sparer du dem vel? :)



Dennis Munding (17-05-2007)
Kommentar
Fra : Dennis Munding


Dato : 17-05-07 17:41

"ShutEye" <no@no.no> skrev i en meddelelse
news:f2hmt8$jpt$1@news.datemas.de...
>> når der nu menes, at man kan *spare* penge, så hænger den oversættelse
>> ikke rigtig sammen længere...
>
> Hvis du gemmer dem i en krukke sparer du dem vel? :)

Jow deet... ;-D


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

Månedens bedste
Årets bedste
Sidste års bedste