[php] $iCnt[]++ mogelijk??

Pagina: 1
Acties:
  • 183 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok hier het probleem...

ik heb een array met daarin een data-array die ik dmv uitmiddeling wil verkleinen. de onderstaande code doet dat perfect.

vb matrix:

[ tijdstip(0) ] [ tijdstip(1) ] [enz..] (tijdstip = unixtime)
[waarde1(0)] [waarde1(1)] [enz..] (waardes zijn bijv percentages)
[waarde2(0)] [waarde2(1)] [enz..]


code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function StoreAverage(&$row, $interval = 300) {
        if($this->iAverageEnd == 0) {     // iaverageEnd is altijd 0 aan het begin
            $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval;
// berekening van iAverageEnd (tijdstip 0 + iAverageDelta * 300secs... 
//bij delta van 12 is de middeling dus over een uur

            $this->iCnt++;
            for($i = 1; $i <= $this->iColumnCount; $i++) {
                $this->arrSum[$i] = $row[$i];
// de waarden op tijdstip 0 in arrSum zetten + iCnt op 1 zetten.
            }
        }
        else {
            if($row[0] < $this->iAverageEnd) {
                $this->iCnt++; 
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrSum[$i] += $row[$i];
// zolang het eindtijdstip niet bereikt is de opvolgende waardes bij arrSum optellen
                }
            }
            else {
                if($row[0] == $this->iAverageEnd) {
                    $this->arrData = array("", $row[0]);
                    $this->iCnt++;
                    for($i = 1; $i <= $this->iColumnCount; $i++) {
                        $this->arrSum[$i] += $row[$i];
                        $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt) );
                        array_push($this->arrData, $this->arrAvg[$i]);
// als het eindtijdstip(iAverageEnd) precies gelijk is aan het tijdstip($row[0]) 
// dan nog optellen bij arrSum en het gemiddelde berekenen 
// door te delen door het aantal punten (iCnt) 
                    }
                    $this->iAverageEnd = 0;
                    $this->iCnt = 0;
                    array_push($this->arrImgData, $this->arrData);
                }
                else {
                    for($i = 1; $i <= $this->iColumnCount; $i++) {
                        $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt) );
                        array_push($this->arrData, $this->arrAvg[$i]);
// Als het tijdstip groter is dan iAverageEnd dan direct het gemiddelde berekenen
// en het volgende punt dat gemiddeld gaat worden
                    }
                    $this->iAverageEnd = 0;
                    $this->iCnt = 0;
                    array_push($this->arrImgData, $this->arrData);

                    $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval;
                    $this->iCnt++;
                    for($i = 1; $i <= $this->iColumnCount; $i++) {
                        $this->arrSum[$i] = $row[$i];
                    }
                }
            }
        }
    }


echter nu het probleem... als er geen data op een bepaald tijdstip opgenomen wordt komt er een -1 te staan... deze waarde geeft natuurlijk problemen bij het middelen en zal verwijderd moeten worden. maar in de array hoeven niet alle waarden op dat tijdstip -1 te zijn...

uiteindelijk zal het gemiddelde dus berekent moeten worden met
$this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt[$i]) ); zodat alle sums door de juiste aantal waardes gedeeld worden (als er dus -1 waardes geskipped worden)

iemand een snelle oplossing hiervoor (zonder het per row te berekenen en daarna bij elkaar te voegen)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

zou je ff wat commentaar bij je code kunnen posten? Wordt er zo niet veel wijzer van. (duidelijk ook geen zin 't goed te lezen :P) En als ik alleen op je topictitel af moet gaan:
$iCnt[] ++ is niet mogelijk :+

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat zou $a[]++ moeten doen dan volgens jou?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ipv dit
$this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt) );

moet ik uiteindelijk dit:
$this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt[$i]) );
bereiken (oftewel het aantal datapunten voor het gemiddelde kan varieren)

ok ik zal wat commentaar erbij zetten...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

leg het eens met woorden uit ipv met code

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • demonite
  • Registratie: April 2000
  • Laatst online: 09-09 20:48

demonite

the way is up

$a[] = 1 kan wel... dan voeg je een nieuw element toe aan de array 'a' met waarde 1

maybe dat $a[]++ een element toevoegd met waarde 0 en die daarna met 1 verhoogd ? geen idee...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik moet dus per rij (tijdstip of waardes) kunnen bijhouden hoeveel punten je er gebruikt worden...
$iCnt[]++ zou dus bij alle waarden in de array 1 moeten kunnen optellen... met if statements kan ik dan kunnen checken of de -1 ergens bestaat en bij die betreffende $iCnt de waarde met 1 kunnen verlagen...

edit: maar ik zie het alweer... het wordt waarschijnlijk weer veel te veel tikken :)
had beter gelijk kunnen beginnen ipv hier zoveel te tikken :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok opgelost: (nu alleen nog wat versnellen)

code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function StoreAverage(&$row, $interval = 300) {
    if($this->iAverageEnd == 0) {
        $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval;
        for($i = 1; $i <= $this->iColumnCount; $i++) {
            $this->arrCnt[$i] = 1;
        }
        for($i = 1; $i <= $this->iColumnCount; $i++) {
            if ($row[$i] == -1) {
                $this->arrCnt[$i] = $this->arrCnt[$i] - 1;                    
            }
            else {
                $this->arrSum[$i] = $row[$i];
            }
        }
    }
    else {
        if($row[0] < $this->iAverageEnd) {
            for($i = 1; $i <= $this->iColumnCount; $i++) {
                $this->arrCnt[$i] += 1;
            }
            for($i = 1; $i <= $this->iColumnCount; $i++) {
                if ($row[$i] == -1) {
                    $this->arrCnt[$i] = $this->arrCnt[$i] - 1;                        
                }
                else {
                    $this->arrSum[$i] += $row[$i];
                }
            }
        }
        else {
            if($row[0] == $this->iAverageEnd) {
                $this->arrData = array("", $row[0]);
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrCnt[$i] += 1;
                }
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    if ($row[$i] == -1) {
                        $this->arrCnt[$i] = $this->arrCnt[$i] - 1;                        
                        $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->arrCnt[$i]) );
                        array_push($this->arrData, $this->arrAvg[$i]);
                    }
                    else {
                        $this->arrSum[$i] += $row[$i];
                        $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->arrCnt[$i]) );
                        array_push($this->arrData, $this->arrAvg[$i]);
                    }
                }
                $this->iAverageEnd = 0;
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrCnt[$i] = 0;
                }
                array_push($this->arrImgData, $this->arrData);
            }
            else {
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->arrCnt[$i]) );
                    array_push($this->arrData, $this->arrAvg[$i]);
                }
                $this->iAverageEnd = 0;
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrCnt[$i] = 0;
                }
                array_push($this->arrImgData, $this->arrData);
                $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval;
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrCnt[$i] = 1;
                }
                for($i = 1; $i <= $this->iColumnCount; $i++) {
                    $this->arrSum[$i] = $row[$i];
                }
            }
        }
    }
}

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

demonite:
maybe dat $a[]++ een element toevoegd met waarde 0 en die daarna met 1 verhoogd ? geen idee...

Nee. $a[] ++ kan niet. Waarom niet? omdat $a[] opzich geen expressie is, laat staan mutable door ++

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

drm schreef op 13 November 2002 @ 12:28:

[...]

Nee. $a[] ++ kan niet. Waarom niet? omdat $a[] opzich geen expressie is, laat staan mutable door ++
Waarom zou het niet kunnen???

kijk hier maar eens naar.

PHP:
1
2
3
4
5
for($i=0;$i< 10 ; $i++) {
$a[]++;
}

print_r($a);


dit geeft als resultaat.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 1
)

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
Nou het is gewoon niet netjes, zet error_reporting maar eens op E_ALL.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

LuCarD:
Waarom zou het niet kunnen???

kijk hier maar eens naar.
[snip]

Hm, dat vind ik heel erg vreemd. Laat ik dan zeggen dat het niet zou moeten kunnen ;)
't Is namelijk niet correct om een on-geinitialiseerde waarde te incrementen. Kijk maar:
PHP:
2
$b = $a++;
Warning: Undefined variable: a in test.php on line 2
PHP:
2
3
$a = array ();
$b = $a[0]++;
Warning: Undefined offset: 0 in test.php on line 3
En:
PHP:
2
3
$a = array ();
$b =$a[];
Fatal error: Cannot use [] for reading in Q:\tmp.php on line 3
Dit alles bij mekaar geraapt, en wetend dat deze warnings in deze situaties voorkwamen, dacht ik wel een logische conclusie te trekken, als ik zei dat 't niet mogelijk was...

Ik hoop dat je snapt waarom 't me verbaast :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Sjaaky schreef op 13 November 2002 @ 12:47:
Nou het is gewoon niet netjes, zet error_reporting maar eens op E_ALL.
Oke...
Dan maak ik er dus dit van.
PHP:
1
2
3
4
5
6
7
error_reporting(E_ALL);
$a=array();
for($i=0;$i< 10 ; $i++) { 
  $a[]++; 
} 

print_r($a);

Resultaat is het zelfde, zonder enige notices of warnings.... :)
drm schreef op 13 November 2002 @ 13:00:

[...]

Hm, dat vind ik heel erg vreemd. Laat ik dan zeggen dat het niet zou moeten kunnen ;)
't Is namelijk niet correct om een on-geinitialiseerde waarde te incrementen. Kijk maar:
PHP:
2
$b = $a++;


[...]
Dit is logisch aangezien ++ geen return value geeft. En de warning krijg je doordat je error_reporting(E_ALL) gebruikt en je hebt $a nog niet gedefineerd. Als je $a van te voren defineert met een NULL gaat het waarschijnlijk wel goed.

$a=NULL;
PHP:
2
3
$a = array ();
$b = $a[0]++;


[...]
Zelfde verhaal als hier boven
En:
PHP:
2
3
$a = array ();
$b =$a[];


[...]
Dit is een logische fout aangezien je met [] niet defineert welk element je uit de array wilt maar je voegt een element toe.
Dit alles bij mekaar geraapt, en wetend dat deze warnings in deze situaties voorkwamen, dacht ik wel een logische conclusie te trekken, als ik zei dat 't niet mogelijk was...

Ik hoop dat je snapt waarom 't me verbaast :)
Ik verbaas me nog steeds elke week over rare dingen zoals dit. :D

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

LuCarD:
Dit is logisch aangezien ++ geen return value geeft.
Dat is niet waar. $a ++ is een expressie die de waarde $a teruggeeft, en daarna $a ophoogt. ++ $a hoogt bijvoorbeeld eerst op, en geeft daarna $a terug:
PHP:
1
2
3
$a = 0;
echo $a ++, "\n";
echo ++$a, "\n";

Geeft:
code:
1
2
0
2
En de warning krijg je doordat je error_reporting(E_ALL) gebruikt en je hebt $a nog niet gedefineerd. Als je $a van te voren defineert met een NULL gaat het waarschijnlijk wel goed.

$a=NULL;
Precies daar gaat het me om. $a is niet gedefinieerd. maar $a[] kan ook niet gedefinieerd zijn, snap je?
Zelfde verhaal als hier boven
idem :+
Dit is een logische fout aangezien je met [] niet defineert welk element je uit de array wilt maar je voegt een element toe.
Jawel, maar het geeft des te harder aan dat $a[] geen geldige expressie kan zijn, dus hoe kan het dan zijn dat $a[] ++ wel kan? Omdat $a[] dus impliciet op 0 geinitialiseerd wordt. En daar zou je imho een warning over moeten krijgen, juist omdat je dat met $a++ of $a[0] ++ ook krijgt, als resp. $a of $a[0] niet gedefinieerd is.
Ik verbaas me nog steeds elke week over rare dingen zoals dit. :D
Ik ben blij dat je me begrijpt :P

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

drm schreef op 13 november 2002 @ 14:21:
[nohtml]
[...]

Dat is niet waar. $a ++ is een expressie die de waarde $a teruggeeft, en daarna $a ophoogt. ++ $a hoogt bijvoorbeeld eerst op, en geeft daarna $a terug:
PHP:
1
2
3
$a = 0;
echo $a ++, "\n";
echo ++$a, "\n";

Geeft:
code:
1
2
0
2
I Stand corrected.... (Je hebt helemaal gelijk)
[...]
Precies daar gaat het me om. $a is niet gedefinieerd. maar $a[] kan ook niet gedefinieerd zijn, snap je?
[...]
[] defineert automatisch een nieuw element aan de Array, deze geeft hij een NULL waarde.

kijk dit maar eens...
PHP:
1
2
3
4
for ($i=0;$i<10;$i++) {
    $a[]=$a;
}
var_dump($a);


Hier zul je zien dat $a hard groeit met allemaal arrays van NULL waardes
Jawel, maar het geeft des te harder aan dat $a[] geen geldige expressie kan zijn, dus hoe kan het dan zijn dat $a[] ++ wel kan? Omdat $a[] dus impliciet op 0
NULL en niet 0 (int versie)
geinitialiseerd wordt. En daar zou je imho een warning over moeten krijgen, juist omdat je dat met $a++ of $a[0] ++ ook krijgt, als resp. $a of $a[0] niet gedefinieerd is.
[...]
[/nohtml]
Juist niet... door dat [] eerst het element toevoegd aan de array en deze naar automagisch een NULL waarde geeft. Daarna wordt deze weer automagisch naar INT veranderd....

WOEI...


Is php niet leuk? 8)7

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
error_reporting(E_ALL);
$a = array();
$a[]++;
$a[]++;
print_r($a);
?>
Array
(
    [0] => 1
    [1] => 1
)

Probeer het dan gewoon uit :P

Je maakt tenslotte een nieuwe waarde en hoogt die een op.
Het boeit verder opzich niet zo dat ie er daarvoor nog niet was. Door de integer-bewerking wordt het elementje verder automagisch een integer en die kent geen null-waarde, daar wordt de 0 gebruikt.

Of daar wel of niet een waarde had moeten staan, het is imho wel erg vies en foutgevoelig...

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ok, jij zegt dus dat $a[] impliciet geinitialiseerd wordt.
Dat zeg ik ook ;)

Jij zegt alleen dat dat de reden is dat het logisch is dat je geen warning krijgt. Dat snap ik niet :? Vind je het dan wel logisch als je hiervoor een warning krijgt :?
code:
1
$a ++;

code:
1
$b [0] ++;

* drm heeft 't gevoel dat we ergens langs mekaar heen praten ofzo

edit:

offtopic:
Nog afgezien van het feit dat die hele $a[]++ constructie geen enkele zin heeft :+

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

drm schreef op 13 november 2002 @ 14:39:
Ok, jij zegt dus dat $a[] impliciet geinitialiseerd wordt.

Dat staat trouwens ook beschreven in de php documentatie dat dat gebeurd ;)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

als ik me even in de discussie mag mengen :+

PHP:
1
2
$a = array ();
$a[0]++;


dit geeft een warning. Waarom? Omdat je een niet-bestaand element probeert op te hogen. Stel nou dat er een functie create () was die een variabele aanmaakt, en deze op NULL initializeert

$a = array ();
create ($a[0]);
$a[0]++;

dit zou dan geen warning moeten geven ($a[0] bestaat immers)

De expressie $a[] doet precies hetzelfde. Het creeert een nieuw element in de array, en initializeert deze op NULL. De returnwaarde van de expressie is een referentie naar het laatste element. $a[]++ zou dus wel kunnen

MAAR: $a = $b[] geeft een error (omdat ie het nieuwe element niet kan lezen). Als ie m niet kan lezen, waarom kun je m dan wel verhogen? Imho moet deze expressie gewoon _geen_ error opleveren (er is immers een element, die schrijfbaar is notabene. Als je naar iets kunt schrijven dan moet je m ook kunnen lezen)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

* ACM drm met de manual om de oren slaat *
:o :o * drm gaat in een schandhoekje zich zitten schamen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
$a = array();
$a[0]++;
$a[0]++;
print_r($a);


Array
(
[0] => 2
)

Lijkt me wel logisch allemaal hoor. Je spreekt toch immers steeds het eerste element van de $a array aan.
Pagina: 1