[php] Voetbal seizoenen op datum knippen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoop dat iemand mij even een lichtje kan opsteken, want ik ben even de draad kwijt.

Voor mijn site wil ik een historie maken van wedstrijden die mijn club in vorige seizoenen gespeeld heeft.
Bijvoorbeeld is er gespeeld op:
zondag 29 September 1996
zaterdag 17 Mei 1997
woensdag 11 Februari 1998
zondag 08 Maart 1998
zondag 22 November 1998
zondag 23 Mei 1999
zondag 12 December 1999
zaterdag 12 Februari 2000

Nu wil ik ervoor zorgen dat er een nette sortering ontstaat, zodat overzichtelijk is in welk seizoen de wedstrijd was. Nu is een feit dat een seizoen nooit later eindigd dan 1 juli en ook niet eerder begint dan 31 juli. Dit houdt dus in dat er precies geknipt moet worden.

Probleem is echter, zoals in het voorbeeld te zien is, soms worden wedstrijden in 1 seizoen in hetzelfde jaar gespeeld. Om een idee te geven wat de output zou moeten zijn van bovenstaande wedstrijden:
- Seizoen 1996/1997
zondag 29 September 1996
zaterdag 17 Mei 1997
-Seizoen 1997/1998
woensdag 11 Februari 1998
zondag 08 Maart 1998
-Seizoen 1998/1999
zondag 22 November 1998
zondag 23 Mei 1999
-Seizoen 1999/2000
zondag 12 December 1999
zaterdag 12 Februari 2000

Als ik echter ga knippen op maand (if maand > 7) en dan de regel Seizoen x/x laat weergegeven dan gaat het gelijk verkeerd. In seizoen 1997/1998 worden namelijk beide wedstrijden in 1998 VOOR 1 juli gespeeld. Ik krijg dan dus geen goede seizoen regel. De output ziet er dan als volgt uit:
- Seizoen 1996/1997
zondag 29 September 1996
zaterdag 17 Mei 1997
woensdag 11 Februari 1998
zondag 08 Maart 1998
- Seizoen 1998/1999
zondag 22 November 1998
zondag 23 Mei 1999
- Seizoen 1999/2000
zondag 12 December 1999
zaterdag 12 Februari 2000

Hou kan ik nou het beste knippen? Op maanden knippen is dus niet mogelijk, op jaren knippen ook niet. Iemand een idee hoe dit enigzins oplosbaar is?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Beide wedsrijden van '98 zijn dus voor 1 juli, maar waarom pakt je code dat dan niet?

Het zou handig zijn als je de relevante code hier plaatst (in [code]...[/code] tags aub ;) ) en duidelijk bent over hoe je die data nu hebt (tekstbestand, array, DB...)
Op maanden knippen is dus niet mogelijk, op jaren knippen ook niet.
Dat kan wel. Je slaat $jaartal op van een wedstrijd, indien maand < juli haal je 1 van jaartal af. Vervolgens print je Seizoen $jaartal - $jaartal + 1. (Dit is een methode, hoe je het precies wil doen hangt van je huidige code en data af).

[ Voor 8% gewijzigd door Voutloos op 15-04-2005 00:01 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Heb het maar even in een hulpfunctie gegoten. Of ik begrijp het probleem niet goed, of de oplossing is zo simpel:

PHP:
1
2
3
4
5
6
7
8
  function getSeizoen($maand, $jaar)
  {
    if($maand<7) $seizoen = ($jaar - 1);
    else $seizoen = $jaar;

    $seizoen = $seizoen . "/" . ($seizoen+1);
    return $seizoen;
  }


of natuurlijk:
PHP:
1
2
3
4
5
  function getSeizoen($maand, $jaar)
  {
    $seizoen = (($maand<7)?($jaar-1):$jaar);
    return ($seizoen . "/" . ($seizoen+1));
  }

[ Voor 24% gewijzigd door Verwijderd op 15-04-2005 00:25 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Idd, hoe staat het in de dataopslag. * T-MOB loves the UNIX timestamp maar het maakt nogal verschil. Tussen 1 juli en 31 juli knippen komt iig niet bijster precies over op me, daar zit 2592000s tussen :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij maak je het jezelf lastiger dan nodig is. Waarom maak je niet 1 tabel waarin per seizoen de start en einddatum opgeslagen staan? Daarmee is harstikke eenvoudig en netjes af te leiden in welk seizoen een wedstrijd gespeeld is. Ben je volgens mij nog flexibeler ook.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Even ter verduidelijking. De gegevens komen uit een database (MySQL) en de datums zijn opgeslagen in UNIX-timestamp formaat.

Er loopt een while loop die de wedstrijden na elkaar uitleest en deze weergeeft. Ik zal even een klein stukje code geven (overbodige rommel geknipt):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$WedstrijdenQuery = "SELECT * FROM wedstrijden WHERE thuisploeg_id='$PloegId' OR uitploeg_id='$PloegId' ORDER BY datum DESC";
WHILE ($WedstrijdenTeller < $WedstrijdenNumber):

  $WedstrijdenId = mysql_result($WedstrijdenResult,$WedstrijdenNumber-$WedstrijdenTeller-1,"id");
  $WedstrijdenDatum = mysql_result($WedstrijdenResult,$WedstrijdenNumber-$WedstrijdenTeller-1,"datum");

  $DatumMaand = date("m", $WedstrijdenDatum);
  $DatumJaar = date("Y", $WedstrijdenDatum);

   if ( ($DatumMaand > 7) )
   {
    $TempJaar = $DatumJaar+1;
    print "Seizoen $DatumJaar / $TempJaar";
   }

   print "$WedstrijdenId - $WedstrijdenDatum";
ENDWHILE;
?php>


Met deze code krijg ik dus het probleem als de wedstrijden allebei in het nieuwe jaar of in het oude jaar zijn.

Als laatste, een extra tabel of veld in de database is in mijn ogen niet nodig. Dat betekend namelijk dat ik voor ongeveer 35 seizoenen (vanaf 1970) die extra gegevens moet gaan bijhouden. Dat is behalve een hoop vulwerk ook een hoop ballast die naar mijn idee niet nodig is.

@Voutloos:
Het gaat fout omdat alle 4 de wedstrijden voor juli zijn. Waardoor de code dus denkt dat het bij elkaar hoort.

@NLG:
Volgens mij hebben wij dezelfde code, al dan niet iets anders geschreven :)

In ieder geval eenieder vast bedankt voor de tips!

edit:

Als knipdatum is trouwens 15 juli van een jaar geschikt :) Om 12:00:00 smiddags, preciezer kan het niet ;)

[ Voor 8% gewijzigd door Verwijderd op 15-04-2005 19:18 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Even in iets ander codingstyle, maar dit zou hem moeten zijn. De truuk zit in het in elke loop bepalen van het huidige seizoen. Deze waarde bewaren voor de volgende iteratie en de titel weergeven als het dan geldende seizoen anders is...
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
$WedstrijdenQuery = mysql_query("SELECT * FROM wedstrijden WHERE thuisploeg_id='$PloegId' OR uitploeg_id='$PloegId' ORDER BY datum DESC");
if (mysql_num_rows($WedstrijdenQuery) > 0)
{
    while ($row = mysql_fetch_assoc($WedstrijdenQuery))
    {
        //fetch vars
        $id = $result['id']; $datum = $result['datum'];

        //seizoen wordt aangeduidt met starjaar... compenseren als maand < juli
        $seizoen = (date("m", $datum) < 7) ? date("y", $datum) - 1 : date("y", $datum);
        $seizoenEind = $seizoen+1;
        
        //print seizoen titel als er een nieuw seizoen is
        if (!isset($laatsteSeizoen) || $seizoen > $laatsteSeizoen) {
            echo 'Seizoen: ' .$seizoen .' - ' .$seizoenEind;
        }

        echo $wedstrijdId .' - ' .date("dmy", $wedstrijddatum);
        
        //bewaren voor volgende iteratie
        $laatsteSeizoen = $seizoen;

    }
}

[ Voor 36% gewijzigd door T-MOB op 15-04-2005 20:27 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-MOB schreef op vrijdag 15 april 2005 @ 20:02:
Even in iets ander codingstyle, maar dit zou hem moeten zijn. De truuk zit in het in elke loop bepalen van het huidige seizoen. Deze waarde bewaren voor de volgende iteratie en de titel weergeven als het dan geldende seizoen anders is...
-knip-
T-MOB thanks! _/-\o_
Dit doet inderdaad de truuk die ik verwacht! Ik ga er morgen (als het weer dag geworden is ;)) is rustig naar kijken hoe het nou in elkaar zit (? en : in de $seizoen = zijn me even onduidelijk nl.) maar het belangrijkste is dat het werkt!

Dank!

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Verwijderd schreef op zaterdag 16 april 2005 @ 00:25:
[...]

T-MOB thanks! _/-\o_
Dit doet inderdaad de truuk die ik verwacht! Ik ga er morgen (als het weer dag geworden is ;)) is rustig naar kijken hoe het nou in elkaar zit (? en : in de $seizoen = zijn me even onduidelijk nl.) maar het belangrijkste is dat het werkt!

Dank!
Oh, dat is een korte notatie om een soort if-else statement te schrijven:
PHP:
1
2
3
4
5
6
7
8
9
$var = ($condition == true) ? 'foo' : 'bar';

//is hetzelfde als:
if ($condition == true) {
  $var = 'foo';
} else {
  $var = 'bar';
}
// alleen dan korter ;)

Verder graag gedaan natuurlijk :)

Regeren is vooruitschuiven

Pagina: 1