[PHP] Array opvullen

Pagina: 1
Acties:

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Onder het mom van "de bomen, welk bos?" heb ik mijn functie in elkaar gehacked.. Het werkt, maar is naar mijn idee HÉÉL erg ranzig..

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
function GetTijden($hid, $lid) {
  if ((is_numeric($hid)) && (is_numeric($lid))) {
    $Result = mysql_query("SELECT id, uur, minuut, dagen
                           FROM tijden
                           WHERE lid = $lid AND hid = $hid
                           ORDER BY dagen, uur, minuut");
    while ($Tijd = mysql_fetch_row($Result)) {
      $TijdOut[$Tijd[3]][$Tijd[1]][] = $Tijd[2];
    } // while
    while (list($Dagen, $Tijden) = each($TijdOut)) {
      $Max = 0;
      for ($i = 0; $i < 24; $i++) {
        if (isset($Tijden[$i])) {
          if (count($Tijden[$i]) > $Max) { $Max = count($Tijden[$i]); }
        } // if
      } // for
      for ($i = 0; $i < 24; $i++) {
        for ($j = 0; $j < $Max; $j++) {
          if (!isset($Tijden[$i][$j])) {
            $Bla[$Dagen][$i][$j] = "";
          } // if
          else $Bla[$Dagen][$i][$j] = $Tijden[$i][$j];
        } // for
      } // for
    } // while
    return $Bla;
  } // if
  else return false;
} // function


Hij werkt!! :D :) Maar wat is de bedoeling van deze functie? Nou.. Dit is een tabel:
code:
1
2
3
4
5
6
7
8
tijden
======
id - mediumint unsigned
lid - mediumint unsigned
hid - mediumint unsigned
uur - tinyint (2) unsigned
minuut - tinyint (2) unsigned zerofill
dagen - tinyint (2) unsigned

Dus..... In de functie na de while-loop op regels 7-9 heb ik zo'n stukkie array:
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
Array
(
    [1] => Array                 (komt overeen met veld dagen)
        (
            [0] => Array         (komt overeen met veld uur)
                (
                    [0] => 01    (komt overeen met veld minuut)
                )

            [5] => Array
                (
                    [0] => 46
                )

            [6] => Array
                (
                    [0] => 03
                    [1] => 33
                    [2] => 51
                )

            [7] => Array
                (
                    [0] => 05
                    [1] => 16
                    [2] => 31
                    [3] => 46
                 )
            ....

Deze array assign ik naar m'n template (Smarty template engine), en die loopt door de uren heen. Hij begint met het uur 0, en loopt dus 1 keer. Dan krijg ik maar 1 rij terug, met voor elk uur 1 waarde, en regelmatig een error "Undefined offset". Da's logisch.. Daarom heb ik deze functie geschreven..

De functie loopt door de uren heen, en zoekt het grootste aantal elementen per uur op (regels 11-16). Daarna loopt ie er nog een keer doorheen, en vult ie de rest van de elementen als ze niet geset zijn (regels 17-24). Dan heb ik de complete array goed gevuld, en geeft Smarty ook geen errors meer. :D Hij werkt :D

Maar het is ranzig.. Hoe zou dit anders kunnen?

[ Voor 0% gewijzigd door DRvDijk op 10-09-2002 12:48 . Reden: Variabelen goed noemen ;) ]


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Extra uitleg? ...

[12:39] <@elviver> gefockte array die gevuld moet worden
[12:39] <E\nste\n> mjah..
[12:40] <@elviver> [rml][ PHP] Array opvullen[/rml]
[12:40] <@elviver> daaro
[12:42] <E\nste\n> even checken
[12:42] <@elviver> lekker hè? :)
[12:43] <@elviver> refresh ff btw
[12:46] <E\nste\n> ok heb et gelezen
[12:46] <E\nste\n> het probleem snap ik alleen nog niet helemaal :D
[12:46] <@elviver> :P
[12:46] <@elviver> Je ziet die array
[12:46] <E\nste\n> jep
[12:46] <E\nste\n> lelijk =)
[12:47] <@elviver> goed hè? :P
[12:47] <@elviver> daar moet dus het eea aan gebeuren...
[12:47] <@elviver> WAnt:
[12:47] <@elviver> 0 heeft 1 element: 0 => 1
[12:47] <@elviver> 5 heeft 1 element: 0 => 46
[12:47] <@elviver> 7 heeft 4 elementen... 05, 16, 31 en 46
[12:47] <@elviver> jah?
[12:48] <E\nste\n> jep
[12:48] <E\nste\n> zo ver was ik nog =)
[12:48] <@elviver> 0/5/7.... daar zijn er 24 van: 0, 1, 2, 3, ... 23
[12:48] <@elviver> met elk 0 of meer subelementen
[12:48] <E\nste\n> jah
[12:48] <@elviver> een daarvan heeft het meeste elementen
[12:48] <@elviver> in dit geval 7, met 4 elementen
[12:49] <E\nste\n> jah
[12:49] <@elviver> dan moet de rest óók 4 elementen krijgen
[12:49] <E\nste\n> hm
[12:49] <@elviver> "" wat mij part, maar ze moeten ff geset zijn
[12:49] <E\nste\n> en dat moet eruit :P
[12:49] <@elviver> ?
[12:50] <E\nste\n> je wilt gewoon dat je niet 4 maar max 1 (bij 1 value) of max 3 bij 3 values hoeft te setten
[12:51] <E\nste\n> euh
[12:51] <E\nste\n> dat snap ik ook niet die zin ;p
[12:52] <E\nste\n> ik kijk nog ff ;)
[12:52] <@elviver> nee... in $Max wordt opgeslagen hoeveel er in het "uur" zitten (die 0, 1, 2, .. 23 dus)
[12:52] <@elviver> daarna loop ik erdoorheen om de rest ook te setten
[12:52] <@elviver> maar da's dus ranzig
[12:53] <E\nste\n> hm
[12:53] <E\nste\n> idd :)

Aanvulling:

[13:02] <E\nste\n> je kunt array_fill gebruiken?
[13:03] <@elviver> nope
[13:03] <@elviver> vanaf versie 4.2.x
[13:03] <E\nste\n> :S
[13:03] <@elviver> op de server 4.1.2

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Is een kickje gerechtvaardigd? Zo niet, mag ie wel de prullenbak in :)

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

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
function GetTijden2($hid, $lid) {
        if ((is_numeric($hid)) && (is_numeric($lid))) {
                $Result = mysql_query("SELECT id, dagen, uur, minuut
                                        FROM tijden
                                        WHERE lid = $lid AND hid = $hid
                                        ORDER BY dagen, uur, minuut");
                $Max = 0;
                while ($Tijd = mysql_fetch_row($Result)) {
                        if ( !isset($Bla[$Tijd[1]]) ) { // no array yet letts cook one
                                $Bla[$Tijd[1]]=array();
                                for ($i = 0; $i < 24; $i++) {
                                        $Bla[$Tijd[1]][$i] = array();
                                }
                        }
                        array_push($Bla[$Tijd[1]][$Tijd[2]],$Tijd[3]); // push it in the hour ;-)
                        // change max if needed
                        $Size = count($Bla[$Tijd[1]][$Tijd[2]]);
                        if ( $Size > $Max ) { $Max = $Size; }
                }

                // now fillup the ones that arent maxed
                foreach ( $Bla as $day => $hours ) {
                        for ($i = 0; $i < 24; $i++) {
                                while ( count($hours[$i]) != $Max ) {
                                        array_push($hours[$i],"");
                                }
                        }
                }
                return $Bla;
        } // if you are reading this you have seen the word if
        else return false;
} // function is done?


volgens mij doet dit wat je wilt?

Skill is when luck becomes a habit.


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Nope helaas :'( Ik vind het wél super PS dat je zoveel tijd erin hebt gestopt! :D

Smarty's uitpoep:
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{$Tijden}
Array (1)
1 => Array (24)
  0 => Array (1)
    0 => 26
  1 => Array (0)
  2 => Array (0)
  3 => Array (0)
  4 => Array (0)
  5 => Array (0)
  6 => Array (3)
    0 => 08
    1 => 28
    2 => 53
  7 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  8 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  9 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  10 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  11 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  12 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  13 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  14 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  15 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  16 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  17 => Array (4)
    0 => 11
    1 => 26
    2 => 41
    3 => 56
  18 => Array (3)
    0 => 11
    1 => 26
    2 => 41
  19 => Array (3)
    0 => 01
    1 => 21
    2 => 41
  20 => Array (3)
    0 => 01
    1 => 21
    2 => 41
  21 => Array (3)
    0 => 01
    1 => 26
    2 => 56
  22 => Array (2)
    0 => 26
    1 => 56
  23 => Array (2)
    0 => 26
    1 => 56

Ze worden dus niet opgevuld... :/

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

PHP:
1
2
3
4
5
6
7
8
9
10
<?
                // now fillup the ones that arent maxed 
                foreach ( $Bla as $day => $hours ) { 
                        foreach ($hours as $hour ) { 
                                while ( count($Bla[$day][$hour]) != $Max ) { 
                                        array_push($Bla[$day][$hour],""); 
                                } 
                        } 
                }
?>


Probeer dit dan eens, maar dit had je zelf ook wel kunnen bedenken,
zo onleesbaar is de code nou ook weer niet.

Skill is when luck becomes a habit.


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Hehehe sorry... Ik was nèt wakker en moest nog ff douchen en koffie hebben voor ik zelf na kon denken ;) Je code is idd niet onduidelijk, integendeel! Ik heb zélden zo duidelijke code gezien! Alleen is het wel érg geindent, maar da's wél inmens duidelijk :)

Ik heb het ondertussen anders opgelost.. Je idee van tijdens de while loop van de mysql_fetch_row al dingen gaan tellen was de oplossing. Dáár moet je idd bijhouden hoeveel elementen er van welke dag en welk uur gefetched zijn. Dat houd ik nu bij in een aparte array, $CountTijden. Die hoef je daarna maar 1 keer door te loopen om tot een goed resultaat te komen :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while ($Tijd = mysql_fetch_row($Result)) {
  if (!isset($CountTijden[$Tijd[3]][$Tijd[1]])) $CountTijden[$Tijd[3]][$Tijd[1]] = 1;
  else $CountTijden[$Tijd[3]][$Tijd[1]]++;
  $Tijden[$Tijd[3]][$Tijd[1]][] = $Tijd[2];
} // while
while (list($Dagen, $TijdenCount) = each($CountTijden)) {
  $Max = max($TijdenCount);
  for ($i = 0; $i < 24; $i++) {
    if (!isset($TijdenCount[$i])) { $TijdenCount[$i] = 0; }
    while ($TijdenCount[$i] < $Max) {
      $Tijden[$Dagen][$i][] = "";
      $TijdenCount[$i]++;
    } // while
  } // for
} // while
return $Tijden;

Nogmaals thanx! :D

[ Voor 0% gewijzigd door DRvDijk op 12-09-2002 16:04 . Reden: Moe'k zelf ook wel goed indenten :P ]

Pagina: 1