Jag stod häromdagen inför ett problem, och problem måste ju lösas. Jag hade en tabell i en mysql data-bas som såg ut enligt följande ungefär.
Startnr (d_Startnr) |
Namn (d_Namn) |
Klass (d_klass) |
Klubb (d_klubb) |
Res.1 (r_t1) |
Res.2 (r_t2) |
Res.3 |
Res.4 |
Res.5 |
Res.6 |
… |
| 26 |
Oscar |
Junior |
|
34 |
54 |
23 |
25 |
54 |
50 |
|
Helt enkelt en resultat-tabell från en serie tävlingar. Nu är det så att om det var 6 tävlingar så ska man bara räkna sina 4 bästa resultat, men för att spetsa till det lite så har man genomfört 5 tävlingar är det 3 resultat som räknas. Har man genomfört 4 eller mindre är det 2 som räknas. Genomförd tävling är en tävling med poäng
Hade jag byggt tabellen annorlunda hade det ju varit en “piece of cake”. Men justeringar när folk mailar om att dom fått 1 poäng för lite på deltävling XX hade blivit lite stökigare. Smidigt att ha allt samlat på en rad tänkte jag.
t.ex.
| Startnr |
Namn |
Tävling |
Poäng |
| 26 |
Oscar |
2 |
54 |
Och lagt en rad för varje tävling i tabellen. Då hade jag ju först gjort en query mot tabellen som är gruperad på startnr, sedan hade jag i den gjort en query som whileade igenom och sedan tog limit 4, nej vänta nu. det går ju inte. Blir ju fel om dom kört 0. Man hade kunnat ställa frågan till databasen med count(startnr) where poäng >0, och sedan tagit antal rader och subtraherat gentemot antal rader som returnerats som borde vara tävlingar…. Men det är ju inte intressant för såhär såg ju inte min tabell ut.
Ännu inget om array’s tänker du nu kanske. Lugn, det kommer.
Jag gjorde en do while-loop som snurrade på mitt register som var enligt det första exemplet. Under varje varv byggde jag upp en $resultArray där jag stoppade in alla poängerna, tävlings-id (ex. res1) som nyckel och poäng kopplat. Samtidigt som jag gjorde det räknade jag samtliga poäng som var över 0. Gjorde sedan en arsort (Array Reverse Sorting) på den vilket gjorde att arrayen nu var i fallande skala i poäng-ordning. Så i nuläget om jag hade gjort en print_r på min $resultArray så hade det blivit ungefär ([res2] => 54, [res5] => 54, [res6] => 50……)
Perfekt. Nu har jag Antal tävlingar som har mer än 0. Jag har en sorterad lista.
Nu har jag en liten if-sats som skapar en ny parameter som heter $countedComp som helt enkelt beroende på antal genomförda tävlingar får ett värde hur många tävlingar som räknas.
Jag loopar igenom min array, med en räknare denna gång. När räknaren passerar $countedComp i värde så sätter jag alla värden till “-“ för att markera att efter där så är det dom tävlingar som räknas bort. Samtidigt passar jag på att addera ihop dom som räknas till en $totalPoints.
Nu har jag en array med borträknade poäng och en variabel med totalpoäng för en deltagare. Hur gör vi nu då?
Vad vi gör är att vi snabbt skapar 2 nya arrayer. En som heter resultorder som vi kopplar ihop startnummer med totalpoängen. sedan gör vi en arsort på denna.
Den andra arrayen fyller vi med startnummer och vår resultArray ($allresults).
Sedan kan vi använda vår resultorder för att hämta ut vår andra array i rätt ordning.
Glasklart?
Då slänger vi in en brasklapp
<?php
$klass = “Junior”;
function countTavlingar($resultArray)
{
$x = 0;
if($resultArray["t1"] > 0)
$x++;
if($resultArray["t2"] > 0)
$x++;
if($resultArray["t3"] > 0)
$x++;
if($resultArray["t4"] > 0)
$x++;
if($resultArray["t5"] > 0)
$x++;
if($resultArray["t6"] > 0)
$x++;
if($resultArray["t7"] > 0)
$x++;
if($resultArray["t8"] > 0)
$x++;
if($resultArray["t9"] > 0)
$x++;
if($x == 9)
return 7;
else if($x ==
return 6;
else if($x == 7)
return 5;
else if($x == 6)
return 4;
else
return 4;
}
function adjustArray($resultArray,$antalT)
{
$x = 0;
$i = 0;
arsort($resultArray);
foreach($resultArray as $key => $val) {
if($x<$antalHeat)
{
$nollArray[$i] = $key;
$i++;
}
$x++;
}
foreach($nollArray as $key => $val) {
$resultArray[$val] = "-";
}
return $resultArray;
}
function TotalPoints($resultArray)
{
foreach($resultArray as $key => $val) {
if($val != "-")
{
$total = $total + $val;
}
}
return $total;
}
function printResult($klass)
{
$x = 0;
include ‘Connections/conn.php’;
mysql_select_db($database_conn,$conn);
$sql_tavlande = ""; //vår fråga mot databasen. bara för att rappla upp resultat
$res_tavlande = mysql_query($sql_tavlande,$conn);
$r_tavlande = mysql_fetch_assoc($res_tavlande);
do{
extract($r_tavlande);
$resultArray = array("t1" => $r_t1,"t2" => $r_t2,"t3" => $r_t3,"t4" => $r_t4,"t5" => $r_t5,"t6" => $r_t6,"t7" => $r_t7,"t8" => $r_t8,"t9" => $r_t9);
$antalT = countTavlingar($resultArray);
$resultArray = adjustArray($resultArray, $antalT);
$total = TotalPoints($resultArray);
$resultArray['tot'] = $total;
$resultArray['d_startnr'] = $d_startnr;
$resultArray['d_namn'] = $d_namn;
$resultArray['d_klass'] = $d_klass;
$resultArray['d_klubb'] = $d_klubb;
$totalArray[$d_startnr] = $total;
$allResults[$d_startnr] = $resultArray;
}while($r_tavlande = mysql_fetch_array($res_tavlande));
//array sort reverse arsort
arsort($totalArray);
$i = 0;
foreach($totalArray as $key => $val)
{
$boll = extract($allResults[$key]);
$x++;
$i++;
if($i == 2)
{
echo "<tr>";
$i = 0;
}
else
echo "<tr bgcolor=’#B2DFEE’>";
if($x == 1)
echo "<td align=’center’><span style=’color:gold;’>$x</style></td>";
else if($x == 2)
echo "<td align=’center’><span style=’color:silver;’>$x</style></td>";
else if($x == 3)
echo "<td align=’center’><span style=’color:#CD7F32;’>$x</style></td>";
else
echo "<td align=’center’>$x</td>";
echo "<td>$d_startnr</td>";
echo "<td>$d_namn</td>";
echo "<td>$d_klubb</td>";
echo "<td>$d_klass</td>";
echo "<td align=’center’>$t1</td>";
echo "<td align=’center’>$t2</td>";
echo "<td align=’center’>$t3</td>";
echo "<td align=’center’>$t4</td>";
echo "<td align=’center’>$t5</td>";
echo "<td align=’center’>$t6</td>";
echo "<td align=’center’>$t7</td>";
echo "<td align=’center’>$t8</td>";
echo "<td align=’center’>$t9</td>";
echo "<td align=’center’>$tot</td>";
echo "</tr>";
}
}
?>
<table>
<?php printResult(“Junior”); ?>
</table>
Vad tror ni om den rotvälskan?
Reserverar mig för något småfel i koden då det är en snabb-strippad variant av vad jag använde på riktigt.
Den riktiga var lite mer omständig att varje tävling var uppdelad i 2 poänggivande moment. Man räknas som deltagande på tävlingen om man tagit poäng i 1 av 2 moment osv. Men rensade här lite för att förenkla.