Avatar billede benneharli Juniormester
03. december 2008 - 23:46 Der er 6 kommentarer og
1 løsning

array af datoer udfra dags dato

Hejsa

Jeg skal på en eller anden måde lave et array af 9 datoer (fødselsdage) hvor næstekommende dato altid er 1. plads osv... Altså en løkke.

Nogen idéer?

/Benji
Avatar billede jakobdo Ekspert
04. december 2008 - 08:28 #1
Hvordan har du datoerne gemt i dag ?
Avatar billede bilal_isa Nybegynder
04. december 2008 - 08:41 #2
<?php

// definer array af datoer
$foedselsdage        =    array();

// tilføj datoer
$foedselsdage[]        =    '2009-05-25';
$foedselsdage[]        =    '2009-11-14';
$foedselsdage[]        =    '2009-04-26';
$foedselsdage[]        =    '2009-03-31';

// definer en funktion som sammenligner datoer

function sammenlign($dato1, $dato2)
{
    if (strtotime($dato1) == strtotime($dato2)) {
        return 0;
    }
    return (strtotime($dato1) < strtotime($dato2)) ? -1 : 1;
}

// kald usort med to parametre dit array af datoer og din
// sammenligningsfunktion

// bemærk at array'et $foedselsdage bliver overført
// som reference parameter, dvs. funktionen usort ændrer
// arrayets værdi

usort($foedselsdage, 'sammenlign');

foreach ($foedselsdage as $dato) {
    print $dato . '<br>';
}
?>
Avatar billede benneharli Juniormester
04. december 2008 - 23:27 #3
--> bilal_isa
Jeg skal ikke have et array der tager udgangspunkt i år. Kun måned og dag.

--> jakobdo
Det kan jeg selv bestemme.

Jeg opsummerer lige, at jeg skal bruge et array, der ændrer sig 9 gange om året. Hver gang en dato er passeret, bliver rækkefølgen jo anderledes.

Lige nu ville rækkefølgen f.eks. se således ud:
18. december
19. december
15. januar
15. februar
4. maj
14. maj
11. september
3. november
30. november

men når 18. december er passeret bliver denne dato SIDSTE post i array'et osv

/Benji
Avatar billede jakobdo Ekspert
05. december 2008 - 08:24 #4
Gem dato i database, så burde du kunne lave udtræk som altid viser de næste 9 fødselsdage.
Avatar billede bilal_isa Nybegynder
05. december 2008 - 17:41 #5
Hej Benji

Du kan gøre din sammenligningsfunktion uafhængig af årstal, så den kun sammenligner på måned og dag. Se nedenfor.

Du har f.eks. dine fødselsdatoer gemt i en MYSQL database eller en XML-fil.

Du hiver dine datoer ud og sætter dem ind i et array.

Så sorterer du dem efter voksende orden.

Tilsidst løber du dem igennem og frasorterer de datoer som er blevet passeret af dagens dato.

<?php

// definer array af datoer
$foedselsdage        =    array();

// tilføj datoer
$foedselsdage[]        =    '1987-05-25';
$foedselsdage[]        =    '1949-11-14';
$foedselsdage[]        =    '1988-04-26';
$foedselsdage[]        =    '1977-03-31';
$foedselsdage[]        =    '1985-01-01';
$foedselsdage[]        =    '1985-12-13';

// definer en funktion som sammenligner datoer

function sammenlign($dato1, $dato2)
{
    $dato_dele_1    =    getdate(strtotime($dato1));
    $dato_dele_2    =    getdate(strtotime($dato2));

    $maaned_1        =    $dato_dele_1['mon'];
    $dag_1            =    $dato_dele_1['mday'];

    $maaned_2        =    $dato_dele_2['mon'];
    $dag_2            =    $dato_dele_2['mday'];
   
    if ($maaned_1 == $maaned_2) {
        if ($dag_1 == $dag_2) {
            return 0;
        } else if ($dag_1 < $dag_2) {
            return -1;
        } else {
            return 1;
        }
    } elseif ($maaned_1 < $maaned_2) {
        return -1;
    }
    return 1;
}

// kald usort med to parametre dit array af datoer og din
// sammenligningsfunktion

// bemærk at array'et $foedselsdage bliver overført
// som reference parameter, dvs. funktionen usort ændrer
// arrayets værdi

// sorterer fødselsdagsdatoerne i voksende
// rækkefølge efter måned og dag (uanset fødselsår)
usort($foedselsdage, 'sammenlign');

$foedselsdage_2        =    array();
$dato_dele_i_dag    =    getdate();

$dag_aktuel            =    $dato_dele_i_dag['mday'];
$maaned_aktuel        =    $dato_dele_i_dag['mon'];


// løb foedselsdage igennem
// tilføj fødselsdatoer som kommer efter dagens dato til $foedselsdage_2

foreach ($foedselsdage as $dato) {
    $dato_dele    =    getdate(strtotime($dato));
    $dag        =    $dato_dele['mday'];
    $maaned        =    $dato_dele['mon'];
   
    if ($maaned_aktuel <= $maaned) {
        if ($dag_aktuel < $dag) {
            $foedselsdage_2[]    =    $dato;   
        }
    }
}

foreach ($foedselsdage_2 as $dato) {
    print $dato . '<br>';
}
?>

Løser det dit problem?
Avatar billede benneharli Juniormester
09. december 2008 - 00:48 #6
Får umiddelbart kun næste dato i print $dato, men det har helt klart givet materiale til at køre videre - tak.

/Benji
Avatar billede bilal_isa Nybegynder
09. december 2008 - 00:57 #7
Det var så lidt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester