Foreach in array om nogmaals te sorteren?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Van Sebas

Van Sebas

05/02/2024 21:25:41
Quote Anchor link
Ik haal gegevens via php uit een mysql database en hierbij selecteer ik op datum alleen sommige waarden in mijn mysql database hebben geen datum maar bv. een waarde als third monday of january.

In mijn php script haal ik de waarden op via een foreach en hier maak ik dan een variabele van welke alle tekst bevat en je krijgt dan bv: 10 januari - tekst, 11 januari - tekst, 22 januari - tekst.

Deze foreach sorteert alleen aan de hand hoe mysql de data inlaadt en aangezien ik in mijn mysql de waarde van third monday of january niet kan ophalen maar dat doe in php krijg je dus dat die waardes bovenaan staan ook al is het bv. 22 januari. Dan begin je niet met 1 januari maar met 22 januari.

Is het mogelijk om in de foreach alle data vanuit mysql in te laten en dit in een variabele te gieten om vervolgens deze data nogmaals met bv. een foreach opnieuw te sorteren? (maar dan wel zo sorteren dat 1 januari als eerste komt en dan 2 januari en daarna 3 januari en niet 1 januari, 11 januari, 12 januari enz).
 
PHP hulp

PHP hulp

21/11/2024 14:04:01
 
- Ariën  -
Beheerder

- Ariën -

05/02/2024 21:33:16
Quote Anchor link
Waarom zet je het niet om naar DATETIME formaat? Nu ben je bezig met plakband-constructies te maken.
 

06/02/2024 08:53:55
Quote Anchor link
Het kan in PHP, maar is ontzettend inefficiënt.
Jouw kennis over databases in het algemeen en over MySQL schiet op dit moment te kort.

Het eerste dat moet worden opgelost is dat je de datums efficiënter bewaart, zodat je er ook echt iets mee kunt gaan doen:
1. Maak in de tabel een tweede kolom van het type datetime.
2. Zet de gegevens van de vrije tekstkolom eenmalig om naar duidelijke datums, bijvoorbeeld met behulp van strtotime().
3. Controleer de gegevens en zet alles wat niet automatisch overgezet kan worden handmatig om naar datumtijd-notatie.
4. Waar het niet kan of te veel werk is: wis die gegevens, je kunt er toch niets mee.
5. Voorkom in je programma dat het weer kan gebeuren dat mensen onzin invullen, bijvoorbeeld door gebruik te maken van <input type="date">. Krijg je een gratis date picker cadeau. Controleer nog wel in PHP of de browser ook echt een datum opstuurt.

Wanneer alle gegevens in een datumtijdkolom zijn bewaard, kan je makkelijk sorteren in de database door via de SQL een ORDER BY statement toe toe voegen aan je SELECT statement. Zie ook: https://www.w3schools.com/mysql
Dat gaat heel efficiënt en je hoeft in PHP alleen de reeds gesorteerde gegevens op te halen. PHP is dan niet meer dan een doorgeefluik tussen de browser en een database.
Gewijzigd op 06/02/2024 08:56:35 door
 
Van Sebas

Van Sebas

06/02/2024 20:42:48
Quote Anchor link
Maar hoe kan ik een datum naar een datetime omzetten als deze jaarlijks anders is? Neem bv. burendag als voorbeeld. Dit is altijd op de vierde zaterdag in september, dat is dit jaar op 28 september maar vorig jaar was het op 23 september. Moet ik dan voor dit soort dagen in mijn database afzonderlijke regels maken met de specifieke datum erin en daar een datetime voor maken? Of kan ik ook een datetime waarde maken van de data "vierde zaterdag van september"?
 
- Ariën  -
Beheerder

- Ariën -

06/02/2024 20:53:18
Quote Anchor link
Dan moet je met de hand alles om gaan zetten naar een DATETIME veld.
Gewijzigd op 06/02/2024 20:59:03 door - Ariën -
 
Ivo P

Ivo P

06/02/2024 21:42:45
Quote Anchor link
Eventueel kun je een veld in je database opnemen "tekstdatum" en daarin iets zetten als 3e maandag in maart

php heeft de mogelijkheid om dat om te zetten middels:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
echo (new DateTime("Last monday of May"))->format("Y-m-d");         //--> 2015-05-25
echo (new DateTime("Last thursday of November"))->format("Y-m-d");  //--> 2015-11-26
?>


Dit draai je dan in het begin van het jaar.

(je tekst zal wel in het Engels moeten zijn denk ik.)
 

07/02/2024 07:24:53
Quote Anchor link
Van Sebas op 06/02/2024 20:42:48:
Maar hoe kan ik een datum naar een datetime omzetten als deze jaarlijks anders is? Neem bv. burendag als voorbeeld. Dit is altijd op de vierde zaterdag in september, dat is dit jaar op 28 september maar vorig jaar was het op 23 september. Moet ik dan voor dit soort dagen in mijn database afzonderlijke regels maken met de specifieke datum erin en daar een datetime voor maken? Of kan ik ook een datetime waarde maken van de data "vierde zaterdag van september"?

Volgens mij begrijp je nog niet goed wat een datum is. Begrippen als burendag, dierendag, Prinsjesdag, Pasen, Ramadan, etc. etc. zijn geen datums. Het zijn afspraken. Als jij het hebt over burendag zonder daarbij een jaartal te noemen, is er niet eens een datum aan te verbinden.

Je kunt het ook omkeren, datums associëren met de afspraken die gelden. Maar als je mensen vraagt om een datum in te vullen, kunnen ze geen afspraken invullen. Tenzij je daar iets aparts voor maakt. Je zou een tabel kunnen vullen met datums en afspraken. Dan kan je die gebruiken in de interface om toch datums te krijgen. Er zijn algoritmes voor om afspraken te berekenen, zoals met Pasen. Daar waar dat niet kan, zoals met de Ramadan, zul je de afspraken handmatig moeten invoeren.

Het is zoals met tijdzones. Als er politiek afwijkende afspraken worden gemaakt, zoals dat we winter- en zomertijd hebben in bepaalde periodes, moeten we dag ook apart vastleggen in een tabel. Onder water rekenen programma's gewoon door met UNIX-timestamps. (Over Windows hebben we het gemakshalve maar niet.) Met tijdzones rekening houden is veel te complex.
Gewijzigd op 07/02/2024 07:26:41 door
 
Ruthie Sullivan

Ruthie Sullivan

07/05/2024 06:00:46
Quote Anchor link
Edit:
Dit doen we dus niet.
Gewijzigd op 07/05/2024 08:43:48 door - Ariën -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.