Draaitabel /pivot
datum | gespeeld |thuis |uit |score
zo 23-09-2012 12:30 Y 06 ADO AJA 1-1
za 10-11-2012 19:45 Y 12 ADO AZA 2-2
zo 05-05-2013 12:30 N 33 ADO FEY 0-0
zo 12-08-2012 16:30 Y 01 AJA AZA 2-2
zo 20-01-2013 14:30 Y 19 AJA FEY 3-0
zo 24-02-2013 14:30 Y 24 AJA ADO 1-1
zo 25-11-2012 14:30 Y 14 AZA FEY 0-2
za 09-03-2013 20:45 Y 26 AZA ADO 1-1
zo 17-03-2013 16:30 N 27 AZA AJA 0-0
zo 28-10-2012 12:30 Y 10 FEY AJA 2-2
zo 16-12-2012 14:30 Y 17 FEY ADO 3-2
zo 10-02-2013 14:30 Y 22 FEY AZA 3-1
een draaitabel /pivot tabel te maken zoals dit:
xxx|ado|aja|aza|fey|
___|___|___|___|___|_
ado| X |1-1|2-2| - |
___|___|___|___|___|_
aja|1-1| X |2-2|2-0|
___|___|___|___|___|_
aza|1-1| - | X |0-2|
___|___|___|___|___|_
fey|3-2|2-2|3-1| X |
___|___|___|___|___|_
Ik heb al lopen zoek maar kan het helaas geen gode oplossng vinden
Misschien moet ik iets met een array doen, waarmee ik per thuisteam een regel maak. Maar ik kom er dus niet uit :-(
Gewijzigd op 14/03/2013 13:09:08 door Mar kla
Wie kan me op weg helpen?
het is zeker mogelijk om dit uit te lezen, met de tussenkomst van een array. Echter weet ik niet wat wat betekent. Kun je al je cellen eens verduidelijken?
cs_wedstrijden_id (oplopen nummer)
cs_wedstrijd_gespeeld (Y of N)
cs_season_id (verwijst naar een table met uitgebreide seizoen info)
cs_wedstrijden_speelronde ( ronde 1 tot X)
cs_wedstrijden_datum (speekt voor zich)
cs_team_id_thuis (verwijst naar de table teams)
cs_team_id_uit (verwijst naar de table teams)
cs_doelthuis (speekt voor zich)
cs_doeluit(speekt voor zich)
en wat ik dus graag zou willen is een over zicht maken zoals bij "uitslagen" op bij voorbeeld http://nl.wikipedia.org/wiki/Eerste_divisie_2013/14 staat
Sorry, ik snap het nog steeds niet. Ik ken echt niet's van die sport?
doe eens een print_r(jouw_array);
Weet je niet wat ik bedoel? laat dan eens stukje php code zien waar de data wordt opgehaald uit de database of de api
Het heeft op zich niets met voetbal te maken. Dat is nu wel de inhoud, maar het had net zo goed schaken of korfbal kunnen wezen.
Het doel is dat er vanuit de tabel een draaitabel komt.
vertical een kolom met de thuis spelende partij en horizontaal een rij met uitspelende partij op de "snij punten" kommen dan het resultaat van de wedstrijd of de datum als de wedstrjid nog gespeeld moet worden.
Diangonaal loopt een rij met lege snijpunten omdat een ploeg nooit tegen zich zelf kan spelen
zie hier een voorbeeld:
http://images.dailyexpress.co.uk/img/dynamic/67/590x/secondary/45471.jpg
Toevoeging op 29/09/2014 19:52:27:
@Frank Nietbelangrijk
In alleen nog maar tot de querie gekomen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
SELECT
g.cs_team_id_thuis ,
t1.TeamName_Short as home,
g.cs_team_id_uit,
t2.TeamName_Short as away,
g.cs_wedstrijden_speelronde as round
FROM
cs_wedstrijden g,
af_teams t1,
af_teams t2
WHERE `cs_season_id` =109
AND g.cs_team_id_thuis= t1.Team_ID
AND g.cs_team_id_uit= t2.Team_ID
order by t1.TeamName_Short, t2.TeamName_Short
?>
SELECT
g.cs_team_id_thuis ,
t1.TeamName_Short as home,
g.cs_team_id_uit,
t2.TeamName_Short as away,
g.cs_wedstrijden_speelronde as round
FROM
cs_wedstrijden g,
af_teams t1,
af_teams t2
WHERE `cs_season_id` =109
AND g.cs_team_id_thuis= t1.Team_ID
AND g.cs_team_id_uit= t2.Team_ID
order by t1.TeamName_Short, t2.TeamName_Short
?>
Code (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
36
37
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
<?php
$stmt = $pdo->query("SELECT
h.teamName_short home,
a.teamName_short away,
CASE m.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m.cs_doelthuis, ' - ', m.cs_doeluit)
WHEN 'N' THEN DATE_FORMAT(datum, '%d-%m-%y')
ELSE 'X' END uitslag
FROM
af_teams h
CROSS JOIN
af_teams a
LEFT JOIN
cs_wedstrijden m
ON h.team_id = m.team_id_thuis
AND a.team_id = m.team_id_uit
AND m.cs_season_id = 109
ORDER BY h.teamName_short, a.teamName_short");
$counter = 0;
$head = '<thead><tr><td>Naam</td>';
$body = '<tbody>';
$tr = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if($row['home'] !== $pointer) {
$counter++;
$pointer = $row['home'];
$tbody .= $tr . '<tr><td>' . $pointer .'</td>';
$tr = '</tr>';
}
if ($counter == 1) {
$thead .= '<td class="rotated">' . $row['away'] . '</td>';
}
$tbody .= '<td>' . $row['uitslag'] . '</td>';
}
echo '<table>' . $thead . '</tr></thead>' . $tbody . '</tr></tbody></table>';
?>
$stmt = $pdo->query("SELECT
h.teamName_short home,
a.teamName_short away,
CASE m.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m.cs_doelthuis, ' - ', m.cs_doeluit)
WHEN 'N' THEN DATE_FORMAT(datum, '%d-%m-%y')
ELSE 'X' END uitslag
FROM
af_teams h
CROSS JOIN
af_teams a
LEFT JOIN
cs_wedstrijden m
ON h.team_id = m.team_id_thuis
AND a.team_id = m.team_id_uit
AND m.cs_season_id = 109
ORDER BY h.teamName_short, a.teamName_short");
$counter = 0;
$head = '<thead><tr><td>Naam</td>';
$body = '<tbody>';
$tr = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if($row['home'] !== $pointer) {
$counter++;
$pointer = $row['home'];
$tbody .= $tr . '<tr><td>' . $pointer .'</td>';
$tr = '</tr>';
}
if ($counter == 1) {
$thead .= '<td class="rotated">' . $row['away'] . '</td>';
}
$tbody .= '<td>' . $row['uitslag'] . '</td>';
}
echo '<table>' . $thead . '</tr></thead>' . $tbody . '</tr></tbody></table>';
?>
Let op de left join, die zorgt ervoor dat de koppeling aan zichzelf ook in het resultaat komt
Gewijzigd op 29/09/2014 21:34:08 door Ger van Steenderen
Dit lijkt me een mooi en compleet script!!
ik ben er even mee aan het stoeien, maar ik kom er nog niet helemaal uit
als ik hem draai dan krijg ik deze errors:
PHP Notice: Undefined variable: pdo in inc_as_competiton_matrix.php on line 2
PHP Fatal error: Call to a member function query() on a non-object in inc_as_competiton_matrix.php on line 2
dat is $stmt = $pdo->query("SELECT
daarnaast lijkt het script zich niks van regel 17 AND m.cs_season_id = 109 aan te trekken
MySQL-functies, MySQLi-functies, PDO?
Omdat ik de opbouw van jouw tabellen niet ken, heb ik met de query een beetje moeten gokken.
Ik zelf heb een tabel waar de teams op seizoen zijn ingedeeld, dit maak dingen een stuk eenvoudiger met het generen van standen. Maar ik weet of dat bij jou ook is.
Dus ik vermoed dat in de tabel af_teams niet alleen de teams staan die aan seizoen 109 meedoen.
Dat met de $pdo ($pdo = new PDO(....)) snap ik even niet. zou je dat wat meer kunnen uitleggen=
De seizoen_id (109) staat inderdaad niet in de teams, want teams kunnen namelijk in meerdere seizoenen aanwezig zijn, maar in de cs_wedstrijden want een wedstrijd zal altijd in één seizoen voorkomen.
Code (php)
1
2
3
2
3
<?php
$pdo = new PDO('mysql:host=localhost;dbname=xxxxxx;charset=utf8', 'wortel', 'willie');
?>
$pdo = new PDO('mysql:host=localhost;dbname=xxxxxx;charset=utf8', 'wortel', 'willie');
?>
Ik begrijp dat je het seizoen niet in de teams heb staan, maar hoe bepaal je dan de indeling per seizoen?.
Zoals gezegd, ik zelf heb daar een tabel voor gemaakt (teams_by_season).
Gewijzigd op 29/09/2014 23:32:37 door Ger van Steenderen
de indeling per siezoen wordt bepaald door de volgende gegevens
cs_wedstrijden_id (oplopend uniek volgnummer, heeft denk ik verder geen verklaring nodig)
cs_wedstrijd_gespeeld (Y of N om te bepalen al gespeeld is of nog gespeeld moet worden)
per seizoen zijn er 306 wedstrijd (18 teams die tegen elkaar spelen behalbve tegen zichzelf)
cs_season_id ((geeft aan in welk seizoen de wedstrijd gespeeld is)
cs_wedstrijden_speelronde (geeft aan welk in speelronde de onderlinge ontmoeting was)
cs_wedstrijden_datum (speekt voor zich)
cs_team_id_thuis (bevat de ID van de teams uit de table teams)
cs_team_id_uit (bevat de ID van de teams uit de table teams)
cs_doelthuis (speekt voor zich)
cs_doeluit(speekt voor zich)
cs_wedstrijden_id mDate team1_id team1_name team2_id team2_name uitslag
1352 30/11 3 ado 4 aja 30/11
1288 27/09 3 ado 5 aza 2 - 3
1386 17/01 3 ado 8 cam 17/01
1478 22/03 4 aja 3 ado 22/03
1418 05/02 4 aja 5 aza 05/02
1523 10/05 4 aja 8 cam 10/05
1501 18/04 5 aza 3 ado 18/04
1244 17/08 5 aza 4 aja 1 - 3
1477 21/03 5 aza 8 cam 21/03
1258 30/08 8 cam 3 ado 3 - 2
1333 09/11 8 cam 4 aja 09/11
1351 29/11 8 cam 5 aza 29/11
ado aja aza cam
ado X 30/11 2-3 17/01
aja 22/03 X 05/02 10/05
aza 18/04 1-3 X 21/03
cam 3-2 09/11 29/11 X
Nb.
Ik heb nu even een beperkte zet data geselecteerd
Code (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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<?php
// even een array zoals die uit de database zou kunnen komen om te testen
$records = array(
array(
'cs_wedstrijden_id' => 1,
'mDate' => '1-10-2014',
'team1_id' => 1,
'team1_name' => 'FC Knudde',
'team2_id' => 2,
'team2_name' => 'FC Losers',
'uitslag' => '1-2',
),
array(
'cs_wedstrijden_id' => 2,
'mDate' => '2-10-2014',
'team1_id' => 3,
'team1_name' => 'Ajax',
'team2_id' => 4,
'team2_name' => 'Feyenoord',
'uitslag' => '2-3',
),
array(
'cs_wedstrijden_id' => 3,
'mDate' => '3-10-2014',
'team1_id' => 1,
'team1_name' => 'FC Knudde',
'team2_id' => 4,
'team2_name' => 'Feyenoord',
'uitslag' => '3-4',
),
array(
'cs_wedstrijden_id' => 4,
'mDate' => '4-10-2014',
'team1_id' => 3,
'team1_name' => 'Ajax',
'team2_id' => 2,
'team2_name' => 'FC Losers',
'uitslag' => '5-6',
),
);
class kruistabel
{
private $records;
private $teams;
private $table;
// constructor, wordt automatisch uitgevoerd.
function __construct($records)
{
$this->records = $records;
$this->makeTeamsArray();
$this->makeTableArray();
}
// verkrijg een array met de namen van de teams
public function getTeamNames()
{
return array_values($this->teams);
}
// verkrijg de complete kruistabel
public function renderTable()
{
$html = '<table>';
foreach($this->table as $row)
{
$html .= '<tr>';
foreach($row as $field)
{
if(is_int($field))
$html .= '<td>' . $this->records[$field]['uitslag'] . '</td>';
else
$html .= '<td>'.$field.'</td>';
}
$html .= '</tr>';
}
return $html . '</table>';
}
// filter alle teams uit de wedstrijden en stop ze in een array
// hierbij komt elk team maar één keer in de array
private function makeTeamsArray()
{
$this->teams = array();
foreach($this->records as $match)
{
echo $match['team1_id'] . '-' . $match['team2_id'] . '-';
$this->teams[$match['team1_id']] = $match['team1_name'];
$this->teams[$match['team2_id']] = $match['team2_name'];
}
// sorteer de teams op alphabetische volgorde (optioneel)
asort($this->teams);
// echo '<pre>'; print_r($this->teams); echo '</pre>';
}
// maak een 2D array met de inhoud voor de tabel
private function makeTableArray()
{
$this->table = array();
$this->table[] = array_merge(array(''), $this->teams);
foreach($this->teams as $id1 => $team1)
{
$row = array();
$row[] = $team1;
foreach($this->teams as $id2 => $team2)
{
if($id1 == $id2)
$row[] = 'X';
else
$row[] = $this->findMatch($id1, $id2);
}
$this->table[] = $row;
}
// echo '<pre>'; print_r($this->table); echo '</pre>';
}
// deze functie zoekt naar wedstrijden tussen team A en team B
// hierbij maakt het niet uit of de volgorde A-B of B-A is
private function findMatch($id1, $id2)
{
foreach($this->records as $key => $match)
{
if(($match['team1_id'] == $id1 && $match['team2_id'] == $id2) || ($match['team1_id'] == $id2 && $match['team2_id'] == $id1))
{
return $key;
}
}
return NULL;
}
}
$kruistabel = new kruistabel($records);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
table {
border-collapse:collapse;
}
table td, table th {
border:1px solid #CCC;
text-align:center;
}
</style>
</head>
<body>
<h2>Teams:</h2>
<ul>
<?php
foreach($kruistabel->getTeamNames() as $name)
echo '<li>'.$name.'</li>';
?>
</ul>
<h2>Kruistabel:</h2>
<?php echo $kruistabel->renderTable(); ?>
</body>
</html>
// even een array zoals die uit de database zou kunnen komen om te testen
$records = array(
array(
'cs_wedstrijden_id' => 1,
'mDate' => '1-10-2014',
'team1_id' => 1,
'team1_name' => 'FC Knudde',
'team2_id' => 2,
'team2_name' => 'FC Losers',
'uitslag' => '1-2',
),
array(
'cs_wedstrijden_id' => 2,
'mDate' => '2-10-2014',
'team1_id' => 3,
'team1_name' => 'Ajax',
'team2_id' => 4,
'team2_name' => 'Feyenoord',
'uitslag' => '2-3',
),
array(
'cs_wedstrijden_id' => 3,
'mDate' => '3-10-2014',
'team1_id' => 1,
'team1_name' => 'FC Knudde',
'team2_id' => 4,
'team2_name' => 'Feyenoord',
'uitslag' => '3-4',
),
array(
'cs_wedstrijden_id' => 4,
'mDate' => '4-10-2014',
'team1_id' => 3,
'team1_name' => 'Ajax',
'team2_id' => 2,
'team2_name' => 'FC Losers',
'uitslag' => '5-6',
),
);
class kruistabel
{
private $records;
private $teams;
private $table;
// constructor, wordt automatisch uitgevoerd.
function __construct($records)
{
$this->records = $records;
$this->makeTeamsArray();
$this->makeTableArray();
}
// verkrijg een array met de namen van de teams
public function getTeamNames()
{
return array_values($this->teams);
}
// verkrijg de complete kruistabel
public function renderTable()
{
$html = '<table>';
foreach($this->table as $row)
{
$html .= '<tr>';
foreach($row as $field)
{
if(is_int($field))
$html .= '<td>' . $this->records[$field]['uitslag'] . '</td>';
else
$html .= '<td>'.$field.'</td>';
}
$html .= '</tr>';
}
return $html . '</table>';
}
// filter alle teams uit de wedstrijden en stop ze in een array
// hierbij komt elk team maar één keer in de array
private function makeTeamsArray()
{
$this->teams = array();
foreach($this->records as $match)
{
echo $match['team1_id'] . '-' . $match['team2_id'] . '-';
$this->teams[$match['team1_id']] = $match['team1_name'];
$this->teams[$match['team2_id']] = $match['team2_name'];
}
// sorteer de teams op alphabetische volgorde (optioneel)
asort($this->teams);
// echo '<pre>'; print_r($this->teams); echo '</pre>';
}
// maak een 2D array met de inhoud voor de tabel
private function makeTableArray()
{
$this->table = array();
$this->table[] = array_merge(array(''), $this->teams);
foreach($this->teams as $id1 => $team1)
{
$row = array();
$row[] = $team1;
foreach($this->teams as $id2 => $team2)
{
if($id1 == $id2)
$row[] = 'X';
else
$row[] = $this->findMatch($id1, $id2);
}
$this->table[] = $row;
}
// echo '<pre>'; print_r($this->table); echo '</pre>';
}
// deze functie zoekt naar wedstrijden tussen team A en team B
// hierbij maakt het niet uit of de volgorde A-B of B-A is
private function findMatch($id1, $id2)
{
foreach($this->records as $key => $match)
{
if(($match['team1_id'] == $id1 && $match['team2_id'] == $id2) || ($match['team1_id'] == $id2 && $match['team2_id'] == $id1))
{
return $key;
}
}
return NULL;
}
}
$kruistabel = new kruistabel($records);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
table {
border-collapse:collapse;
}
table td, table th {
border:1px solid #CCC;
text-align:center;
}
</style>
</head>
<body>
<h2>Teams:</h2>
<ul>
<?php
foreach($kruistabel->getTeamNames() as $name)
echo '<li>'.$name.'</li>';
?>
</ul>
<h2>Kruistabel:</h2>
<?php echo $kruistabel->renderTable(); ?>
</body>
</html>
nu moet ik alleen nog het resultaat van mij query naar de Array
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
SELECT
m1.cs_wedstrijden_id,
date_format(m1.cs_wedstrijden_datum, '%d/%m') as mDate,
m1.cs_team_id_thuis AS team1_id,
t1.TeamName_Short AS team1_name,
m1.cs_team_id_uit AS team2_id,
t2.TeamName_Short AS team2_name,
CASE m1.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m1.cs_doelthuis, ' - ', m1.cs_doeluit)
WHEN 'N' THEN date_format(m1.cs_wedstrijden_datum, '%d/%m')
ELSE 'X' END uitslag
FROM
cs_wedstrijden m1, af_teams t1, af_teams t2
WHERE
cs_season_id =110
AND
t1.Team_ID = cs_team_id_thuis
AND
t2.Team_ID = cs_team_id_uit
ORDER by t1.TeamName_Short , t2.TeamName_Short
?>
SELECT
m1.cs_wedstrijden_id,
date_format(m1.cs_wedstrijden_datum, '%d/%m') as mDate,
m1.cs_team_id_thuis AS team1_id,
t1.TeamName_Short AS team1_name,
m1.cs_team_id_uit AS team2_id,
t2.TeamName_Short AS team2_name,
CASE m1.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m1.cs_doelthuis, ' - ', m1.cs_doeluit)
WHEN 'N' THEN date_format(m1.cs_wedstrijden_datum, '%d/%m')
ELSE 'X' END uitslag
FROM
cs_wedstrijden m1, af_teams t1, af_teams t2
WHERE
cs_season_id =110
AND
t1.Team_ID = cs_team_id_thuis
AND
t2.Team_ID = cs_team_id_uit
ORDER by t1.TeamName_Short , t2.TeamName_Short
?>
Gewijzigd op 05/10/2014 17:58:40 door Frank Nietbelangrijk
dat van die PDO snap ik even niet
Met onderstaand code krijg ik nu de errors
PHP Notice: Undefined variable: kruistabel in new1.php on line 153
PHP Fatal error: Call to a member function renderTable() on a non-object in new1.php on line 153
Code (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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8;user='ikke';password='blabla'");
$stmt = $pdo->query("SELECT
m1.cs_wedstrijden_id,
date_format(m1.cs_wedstrijden_datum, '%d/%m') as mDate,
m1.cs_team_id_thuis AS team1_id,
t1.TeamName_Short AS team1_name,
m1.cs_team_id_uit AS team2_id,
t2.TeamName_Short AS team2_name,
CASE m1.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m1.cs_doelthuis, ' - ', m1.cs_doeluit)
WHEN 'N' THEN date_format(m1.cs_wedstrijden_datum, '%d/%m')
ELSE 'X' END uitslag
FROM
cs_wedstrijden m1, af_teams t1, af_teams t2
WHERE
cs_season_id =110
AND
t1.Team_ID = cs_team_id_thuis
AND
t2.Team_ID = cs_team_id_uit
ORDER by t1.TeamName_Short , t2.TeamName_Short") or die(mysql_error());
while ($records = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
class kruistabel
{
private $records;
private $teams;
private $table;
// constructor, wordt automatisch uitgevoerd.
function __construct($records)
{
$this->records = $records;
$this->makeTeamsArray();
$this->makeTableArray();
}
// verkrijg een array met de namen van de teams
public function getTeamNames()
{
return array_values($this->teams);
}
// verkrijg de complete kruistabel
public function renderTable()
{
$html = '<table>';
foreach($this->table as $row)
{
$html .= '<tr>';
foreach($row as $field)
{
if(is_int($field))
$html .= '<td>' . $this->records[$field]['uitslag'] . '</td>';
else
$html .= '<td>'.$field.'</td>';
}
$html .= '</tr>';
}
return $html . '</table>';
}
// filter alle teams uit de wedstrijden en stop ze in een array
// hierbij komt elk team maar één keer in de array
private function makeTeamsArray()
{
$this->teams = array();
foreach($this->records as $match)
{
echo $match['team1_id'] . '-' . $match['team2_id'] . '-';
$this->teams[$match['team1_id']] = $match['team1_name'];
$this->teams[$match['team2_id']] = $match['team2_name'];
}
// sorteer de teams op alphabetische volgorde (optioneel)
asort($this->teams);
// echo '<pre>'; print_r($this->teams); echo '</pre>';
}
// maak een 2D array met de inhoud voor de tabel
private function makeTableArray()
{
$this->table = array();
$this->table[] = array_merge(array(''), $this->teams);
foreach($this->teams as $id1 => $team1)
{
$row = array();
$row[] = $team1;
foreach($this->teams as $id2 => $team2)
{
if($id1 == $id2)
$row[] = 'X';
else
$row[] = $this->findMatch($id1, $id2);
}
$this->table[] = $row;
}
}
// deze functie zoekt naar wedstrijden tussen team A en team B
// hierbij maakt het niet uit of de volgorde A-B of B-A is
private function findMatch($id1, $id2)
{
foreach($this->records as $key => $match)
{
if(($match['team1_id'] == $id1 && $match['team2_id'] == $id2) || ($match['team1_id'] == $id2 && $match['team2_id'] == $id1))
{
return $key;
}
}
return NULL;
}
}
$kruistabel = new kruistabel($records);
?>
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8;user='ikke';password='blabla'");
$stmt = $pdo->query("SELECT
m1.cs_wedstrijden_id,
date_format(m1.cs_wedstrijden_datum, '%d/%m') as mDate,
m1.cs_team_id_thuis AS team1_id,
t1.TeamName_Short AS team1_name,
m1.cs_team_id_uit AS team2_id,
t2.TeamName_Short AS team2_name,
CASE m1.cs_wedstrijd_gespeeld
WHEN 'Y' THEN CONCAT(m1.cs_doelthuis, ' - ', m1.cs_doeluit)
WHEN 'N' THEN date_format(m1.cs_wedstrijden_datum, '%d/%m')
ELSE 'X' END uitslag
FROM
cs_wedstrijden m1, af_teams t1, af_teams t2
WHERE
cs_season_id =110
AND
t1.Team_ID = cs_team_id_thuis
AND
t2.Team_ID = cs_team_id_uit
ORDER by t1.TeamName_Short , t2.TeamName_Short") or die(mysql_error());
while ($records = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
class kruistabel
{
private $records;
private $teams;
private $table;
// constructor, wordt automatisch uitgevoerd.
function __construct($records)
{
$this->records = $records;
$this->makeTeamsArray();
$this->makeTableArray();
}
// verkrijg een array met de namen van de teams
public function getTeamNames()
{
return array_values($this->teams);
}
// verkrijg de complete kruistabel
public function renderTable()
{
$html = '<table>';
foreach($this->table as $row)
{
$html .= '<tr>';
foreach($row as $field)
{
if(is_int($field))
$html .= '<td>' . $this->records[$field]['uitslag'] . '</td>';
else
$html .= '<td>'.$field.'</td>';
}
$html .= '</tr>';
}
return $html . '</table>';
}
// filter alle teams uit de wedstrijden en stop ze in een array
// hierbij komt elk team maar één keer in de array
private function makeTeamsArray()
{
$this->teams = array();
foreach($this->records as $match)
{
echo $match['team1_id'] . '-' . $match['team2_id'] . '-';
$this->teams[$match['team1_id']] = $match['team1_name'];
$this->teams[$match['team2_id']] = $match['team2_name'];
}
// sorteer de teams op alphabetische volgorde (optioneel)
asort($this->teams);
// echo '<pre>'; print_r($this->teams); echo '</pre>';
}
// maak een 2D array met de inhoud voor de tabel
private function makeTableArray()
{
$this->table = array();
$this->table[] = array_merge(array(''), $this->teams);
foreach($this->teams as $id1 => $team1)
{
$row = array();
$row[] = $team1;
foreach($this->teams as $id2 => $team2)
{
if($id1 == $id2)
$row[] = 'X';
else
$row[] = $this->findMatch($id1, $id2);
}
$this->table[] = $row;
}
}
// deze functie zoekt naar wedstrijden tussen team A en team B
// hierbij maakt het niet uit of de volgorde A-B of B-A is
private function findMatch($id1, $id2)
{
foreach($this->records as $key => $match)
{
if(($match['team1_id'] == $id1 && $match['team2_id'] == $id2) || ($match['team1_id'] == $id2 && $match['team2_id'] == $id1))
{
return $key;
}
}
return NULL;
}
}
$kruistabel = new kruistabel($records);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kruistable</title>
<style>
table {
border-collapse:collapse;
}
table td, table th {
border:1px solid #CCC;
text-align:center;
}
</style>
</head>
<body>
</body>
</html>
Gewijzigd op 05/10/2014 20:42:40 door mar kla
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class kruistabel
{
// HIER DIE CLASS VAN MIJ
}
$pdo = new PDO("mysql:host=localhost;dbname=adostatsTEST;charset=utf8;user='ikke';password='blabla'");
$stmt = $pdo->query("HIER DIE MOOIE QUERY VAN JOU :-)") or die(mysql_error());
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);
$kruistabel = new kruistabel($records);
echo $kruistabel->renderTable();
?>
class kruistabel
{
// HIER DIE CLASS VAN MIJ
}
$pdo = new PDO("mysql:host=localhost;dbname=adostatsTEST;charset=utf8;user='ikke';password='blabla'");
$stmt = $pdo->query("HIER DIE MOOIE QUERY VAN JOU :-)") or die(mysql_error());
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);
$kruistabel = new kruistabel($records);
echo $kruistabel->renderTable();
?>
hartstikke bedankt!!