[PHP] bizarre fout in geneste for()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit dus met een vrij raar probleem en waar ik de fout echt niet kan uithalen.
Code is als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if($type=="percent"){                                   //berekenen van de juiste percentages + totalen
        for($r=12; $r<=$rij; $r++){
            $totaal = 0;
            for($k=1; $k<=count($projname); $k++){          //totaal per rij berekenen
                $totaal =   $totaal + $totalrow[$r][$k+1];
            }
            
            for($k=1; $k<=count($projname); $k++){          //voor ieder element uit de rij, delen door rijtotaal*100
                if($totalrow[$r][$k+1]>0){
                    $t[$r][$k]  = ($totalrow[$r][$k+1]/$totaal)*100;
                    $x          = $x + $t[$r][$k];
                    //$worksheet1->write_number($r,$k+1,$t[$r][$k]);
                }
            }       
        }
        for($k=1; $k<=count($projname); $k++){
            $totalcol   = 0;
            for($r=12; $r<=$rij; $r++){                     //voor iedere kolom totaal berekenen
                $totalcol   = $totalcol + $t[$r][$k];
                $worksheet1->write_number($r, $k+1, $t[$r][$k]);
                //$worksheet1->write_string($r,$k+1,"rij:".$r." kolom:".$k);

            }
            $t  = ($totalcol/$x)*100;
            $worksheet1->write_number($rij+1,$k+1,$totalcol);                   
        }


De bedoeling van dit stukje code is om een soort kruistabel met percentages weg te schrijven naar excel (via $worksheet1->write)
In de eerste geneste forlus wordt er voor iedere rij een totaal berekent, en daarna zal voor iedere cel (in iedere rij) de procentberekening (waarde/rijtotaal*100) worden uitgevoerd.
Ik moet ook kolomtotalen hebben (in percentages) en ik dacht simpelweg dezelfde code nog eens uit te voeren (2e geneste for), maar dan kolomsgewijs.
De waarde van iedere cel wordt in een 2-dimensionale array opgeslagen
PHP:
1
$t[$r][$k]
en deze kan aangesproken worden in de 2e lus.

Wat is nu het probleem :
In mijn 2e geneste for-lus wordt er maar in 1 kolom de juiste waarden getoond en de andere kolommen worden nul. Als ik mijn for-lus vanaf de 2e kolom laat starten, dan blijft kolom 1 leeg (logisch), kolom 2 is netjes ingevuld en kolom3 geeft nullen (wat dus niet klopt).
Bij het starten vanaf kolom 3 : 1 en 2 leeg, 3 goed ingevuld.

Ik heb ook getest of mijn geneste forlussen goed worden uitgevoerd en dit is ook zo, als ik rij en kolomnummer meegeef als waarde, dan zijn alle 3 de kolommen ingevuld.
Ik snap dus echt niet waar het probleem ligt : forlussen zijn goed en de data ook.

Hopelijk heeft er iemand enig idee, want dit is echt niet leuk.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik zou zeggen, ga eens refactoren. Dat houdt in: geef alle variabelen duidelijke namen waar ze voor dienen (dus ook die for loop indexes) en maak van iedere lus even een aparte functie. Ik zie bij iedere lus al een stukje commentaar staan. Daaruit kun je dus gemakkelijk de naam van de functie halen. Vrijwel altijd als je ergens commentaar bij moet zetten op deze manier is het beter om er een functie van te maken of om wat variabel namen te hernoemen. Ik denk dat je tijdens dat proces zelf al beter zult begrijpen wat er nou fout gaat.

[ Voor 45% gewijzigd door Michali op 20-04-2005 15:18 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is ondertussen opgelost. Vraag me niet waar de fout zat, kvind hem zelf niet.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
misschien denk ik te simpel hoor, maar kun je niet gewoon twee loopjes maken de eerste om door de rijen heen te lopen en de tweede om per rij door alle kolommen te lopen, waarbij je bij iedere waarde die je tegenkomt telkens de totaal-waarde van de huidige rij en huidige kolom ophoogt met de waarde die je op dat moment heb?
Je moet dan alleen nog 1 keertje door de totalen lopen om de percentages te berekenen.

maar dat is qua structuur volgens mij een stuk overzichtelijker dan wat je nu heb

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 20 april 2005 @ 15:35:
Het is ondertussen opgelost. Vraag me niet waar de fout zat, kvind hem zelf niet.
Dat is dus meteen het nadeel van de code die je nu hebt. Het is vrij onleesbaar, zeker voor buitenstaanders. En op een moment dat ik zoveel fors onder elkaar zie staan, dan kan ik het niet helpen om te denken dat het veel compacter/efficiënter/duidelijker kan. Wat dat betreft zou ik Michali's tip zeker ter harte nemen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op woensdag 20 april 2005 @ 15:35:
Het is ondertussen opgelost. Vraag me niet waar de fout zat, kvind hem zelf niet.
Als je zelf niet eens begrijpt wat er gebeurt of wat er fout gaat... geen goed teken als je het mij vraagt. Ik zou eerst eens wat moeite gaan nemen om je code begrijpelijker en overzichtelijker te maken voordat je verder gaat. Dat kan je nog heel wat problemen gaan schelen. Maar je moet het zelf weten natuurlijk. :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb dus zoals voorgesteld door Michali alle variabelen een logischere naam gegeven en toen werkte het zoals het moest. Aan de code heb ik verder niets veranderd.
Keuze van de variabelen was niet goed, maar ik was al een eindje bezig met testen, code verplaatsen,...
dus dan komt het er niet zo heel erg op aan.

@ marty : als ik uw redenering goed volg denk ik niet dat dat gaat werken. De waarden in iedere cel moeten namelijk eerst allemaal opgeteld worden om tot een rijtotaal te komen en daarna wordt diezelfde waarde vervangen door zichelf/rijtotaal * 100. Daarna gebeurt hetzelfde maar per kolom : alle waarden optellen tot een kolomtotaal,( kolomtotaal/totaal van alle cellen) *100

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik zat hier aan te denken
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// tabel met data
$tabel = array(
        array(1,4,8),
        array(2,5,9),
        array(3,3,3)
        );

// totaal bepalen
$total = 0;
foreach ($tabel AS $arr)
    $total += array_sum($arr);

$new_tabel = array(); // nieuwe tabel die procenten gaat bevatten
$rowcount = 1;
foreach ($tabel AS $row) // voor iedere regel
{
     // row-totaal ff netjes op 0 zetten
    if (!isset($row_total[$rowcount]))
        $row_total[$rowcount] = 0;
    $colcount = 1;
    foreach ($row AS $col)  // voor iedere regel (per rij dus)
    {
         // column-totaal ff netjes op 0 zetten
        if (!isset($col_total[$colcount]))
            $col_total[$colcount] = 0;
        $col_total[$colcount] += $col; // column totaal ophogen 
        $row_total[$rowcount] += $col; // row totaal ophogen
        $new_tabel[$rowcount][$colcount] = (($col * 100) / $total);  // procentwaarde in nieuwe tabel proppen
        $colcount++;
    }
    $rowcount++;
}
print_r($col_total);
print_r($row_total);
print_r($new_tabel);
Pagina: 1