[PHP] sort op dichtstbijzijnde datum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
Ik probeer dus een array met datums uit het verleden en in de toekomst te sorteren, zo op de manier dat de datum meest dichtbij "vandaag" bovenaan komt te staan. Dit lukt me dus niet met de functies wat PHP biedt.
Hoe doe ik dit? Je zult namelijk elk element op zich met de huidige datum vergelijken en met alle elementen die al in de array staan.
Iemand een tip om me op weg te helpen?

[ Voor 5% gewijzigd door Rfce op 01-08-2007 16:08 ]

euh...ja


Acties:
  • 0 Henk 'm!

Verwijderd

- Verschil berekenen (absoluut, positief dus)
- Dat sorteren
- Die volgorde gebruiken voor het weergeven

[ Voor 13% gewijzigd door Verwijderd op 01-08-2007 16:11 ]


Acties:
  • 0 Henk 'm!

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
OK, dus je zegt eigenlijk dus elk element opzich vergelijken met de huidige datum, daarvan het absolute verschil als value met die betreffende datum als key. Vervolgens sorteren op value.
OK, ga dat een proberen.

euh...ja


Acties:
  • 0 Henk 'm!

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
Met TRRoads ^

Bij het vullen van de datum array, een tweede array vullen met als key de datum, en als waarde het verschil (maakt het nog uit of de datum positief of negatief verschilt?).

Die kun je dan naar hartelust sorteren.

Of gewoon even refreshen, en zien dat de TS het zelf al bedacht had.

[ Voor 16% gewijzigd door arieleks op 01-08-2007 16:18 ]

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


Acties:
  • 0 Henk 'm!

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
OK, thnx dat was snel opgelost, dat ik daar niet zelf op gekomen was.

euh...ja


Acties:
  • 0 Henk 'm!

Verwijderd

Weg

[ Voor 98% gewijzigd door Verwijderd op 01-08-2007 16:32 . Reden: Bericht ingetrokken. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 01 augustus 2007 @ 16:23:
Is het niet mogelijk om dit bij het vullen van de array al direct goed te doen?

Verder hoeft het vergelijken naar vandaag op zich nog niet, je kunt ook de timestamp als key gebruiken en de array op de keys descending sorteren. :)
Zodat zaken in de toekomst hoger komen te staan als zaken in het verleden?

Dat was dus niet wat de TS vroeg, het moet relatief zijn aan vandaag.

[ Voor 4% gewijzigd door Verwijderd op 01-08-2007 16:27 ]


Acties:
  • 0 Henk 'm!

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
Verwijderd schreef op woensdag 01 augustus 2007 @ 16:23:
Is het niet mogelijk om dit bij het vullen van de array al direct goed te doen?

Verder hoeft het vergelijken naar vandaag op zich nog niet, je kunt ook de timestamp als key gebruiken en de array op de keys descending sorteren. :)
Vergeef me mijn eventuele kortzichtheid, schrijnend tekort aan caffeine (Nespresso kapot op werk, de hel op aarde), maar dan weet je toch nog steeds niets, aangezien de data zowel in het verleden als in de toekomst kunnen liggen?

Edit: mijn caffeine tekort heeft duidelijk ook invloed op mijn refresh capaciteiten.

[ Voor 7% gewijzigd door arieleks op 01-08-2007 16:29 . Reden: arie is een beetje traag vandaag ]

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


Acties:
  • 0 Henk 'm!

Verwijderd

Weg

[ Voor 96% gewijzigd door Verwijderd op 01-08-2007 16:32 . Reden: Bericht ingetrokken. ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
Select Abs(DateDiff(d,GetDate(),MyDateField))

Geeft toch de relatieve afstand (in dagen) van MyDateField tot vandaag?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op woensdag 01 augustus 2007 @ 16:32:
code:
1
Select Abs(DateDiff(d,GetDate(),MyDateField))

Geeft toch de relatieve afstand (in dagen) van MyDateField tot vandaag?
SQL in PHP?

Acties:
  • 0 Henk 'm!

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
Of je laat een check meelopen bij het vullen van de array (waar komen de data eigenlijk vandaan?).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$dichtst_bij_vandaag=-1; 
$dichtst_bij_vandaag_timestamp=0; 
$vandaag=mktime();

//begin array vul loopje

arraypush($mijnArray,$waarde);
if(abs($waarde-$vandaag)<$dichtst_bij_vandaag||$dichtst_bij_vandaag==-1) {
    $dichtst_bij_vandaag_timestamp=$waarde;
    $dichtst_bij_vandaag=abs($waarde-$vandaag);
}

//einde loopje


echo $dichtst_bij_vandaag_timestamp;


Of zoiets.

Excuses voor de var namen, doe ik normaal ietsjes anders.... ;)

[ Voor 26% gewijzigd door arieleks op 01-08-2007 16:47 . Reden: cruciale regel vergeten ]

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Was meer bedoeld als pseudo-code ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 18-09 12:59
Of je gebruikt usort() en maakt zelf een functie die van de twee gegeven waarden kijkt welke het dichtste bij de dag van vandaag zit. Zit de eerste het dichtste bij, geef dan een 1 terug, zit de tweede het dichtste bij -1 en als het gelijk is gewoon 0. Dan kan je later gewoon als het moet aan dezelfde array nog items toevoegen en opnieuw sorteren zonder allemaal fratsen uit te hoeven halen :)

Acties:
  • 0 Henk 'm!

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
arieleks schreef op woensdag 01 augustus 2007 @ 16:40:
Of je laat een check meelopen bij het vullen van de array (waar komen de data eigenlijk vandaan?).
Dat wordt het uiteindelijk ook... ik moest eerst een test hebben om te kijken hoe ik het bewerkstelligde. Data komt nu nog uit text-files (in de toekomst mogelijk uit een dbase, maar ik weet niet of dat nog noodzakelijk wordt). Het zijn allemaal vrij platte en kleine arrays... rekenen is dus zo gebeurt.
Of je gebruikt usort() en maakt zelf een functie die van de twee gegeven waarden kijkt welke het dichtste bij de dag van vandaag zit. Zit de eerste het dichtste bij, geef dan een 1 terug, zit de tweede het dichtste bij -1 en als het gelijk is gewoon 0. Dan kan je later gewoon als het moet aan dezelfde array nog items toevoegen en opnieuw sorteren zonder allemaal fratsen uit te hoeven halen
Ik voer het nu uit zoals TRRoads als idee aandroeg. Zoals jij nu omschrijft is het vrij omslachtig toch?
Ik loop gewoon door mijn array (het zijn timestamps) en tijdens het loopen maak ik een nieuwe aan met de timestamp als key en het absolute verschil als value. Daarna sort ik de nieuwe array op value, en klaar is kees.

euh...ja


Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 18-09 12:59
Rfce schreef op woensdag 01 augustus 2007 @ 20:43:

[...]


Ik voer het nu uit zoals TRRoads als idee aandroeg. Zoals jij nu omschrijft is het vrij omslachtig toch?
Ik loop gewoon door mijn array (het zijn timestamps) en tijdens het loopen maak ik een nieuwe aan met de timestamp als key en het absolute verschil als value. Daarna sort ik de nieuwe array op value, en klaar is kees.
Met usort() ben je zonder die tweede array klaar. Hier een voorbeeldje met gewoon wat getallen, maar het idee blijft natuurlijk hetzelfde en als je alle getallen vervangt met jouw timestamps zou het ook gewoon moeten werken :)


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
// Array met al jouw waarden
$jouwarray = array(1, 15, 4, 20, 9, 12, 7);

// Voor sorteren
echo "<pre>" . print_r($jouwarray, true) . "</pre>";

// Sorteren maar
usort($jouwarray, "sortontime");

// Na sorteren
echo "<pre>" . print_r($jouwarray, true) . "</pre>";

function sortontime($a, $b)
{
    // $vandaag vervangen met je eigen timestamp van "vandaag" met date() ofzo
    $vandaag = 10;
    if (abs($a - $vandaag) > abs($b - $vandaag))
    {
        return 1;
    }
    else if (abs($a - $vandaag) < abs($b - $vandaag))
    {
        return -1;
    }
    return 0;
}
Pagina: 1