Προς το περιεχόμενο

PHP: υπολογισμός Ιδιότητας προφίλ (λίστα) βάσει ημερομηνίας


philos

Προτεινόμενες αναρτήσεις

Λοιπόν, έχουμε τα εξής δεδομένα:

Το πεδίο idiotita που έχει επιλογές:
Μαθητής Α' γυμνασίου
Μαθητής Β' γυμνασίου
Μαθητής Γ' γυμνασίου
Μαθητής Α' λυκείου
Μαθητής Β' λυκείου
Μαθητής Γ' λυκείου
Απόφοιτος

Και την ημερομηνία join_date (unix time) που ο χρήστης έκανε την παραπάνω δήλωση.

Θέλω να τρέξω ένα script σε PHP ώστε να ενημερώσω αυτά τα στοιχεία προφίλ με κατάληξη το Απόφοιτος.

Δηλαδή το script βάσει του join_date και με δεδομένη ημερομηνία την 1η Σεπτεμβρίου κάθε χρονιάς, τη στιγμή που τρέχει να διορθώνει το πεδίο για όλους τους χρήστες.

Παράδειγμα, η join_date δίνει ημερομηνία 5 Μαϊου 2019 και idiotita Β' Γυμνασίου.

Αν τρέχω σήμερα το script θα πρέπει να σκεφτεί:

τον Μαιο 2019 ήταν / δήλωσε (join_date) Β' Γυμνασίου

τον Σεπτέμβριο 2019 κι έπειτα πήγε Γ' Γυμνασίου

τον Σεπτέμβριο του 2020 κι έπειτα πήγε Α' Λυκείου

τον Σεπτέμβριο του 2021 κι έπειτα πήγε Β' Λυκείου

-> έχουμε Οκτώβρη του 2021 και τρέχουμε το script, άρα το αποτέλεσμα γι' αυτόν τον χρήστη είναι: Μαθητής Β' Λυκείου.

Καμιά ολοκληρωμένη ή αλγοριθμική ιδέα για το πως να εξάγω το αποτέλεσμα; :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα υποθέσω ότι πρόκειται για σχολική εργασία και θα σου προτείνω μια "non optimized" λυση,  η οποία θα δουλέψει εύκολα.  Θα πάρεις από την ημερομηνία μονο τον μήνα και το έτος. Και θα δουλέψεις nested if. Για παράδειγμα:

 

If year<2017 {

echo "Ακομα στο δημοτικο"

}

else if year=2017 {

   if month<10 {

          echo"Ακομα στο δημοτικο"

          {

     else {

          echo"Α γυμνασιου"

     }

else if .........

 

Με αυτο το τρόπο θα καλύψεις όλες τις περιπτώσεις,  με 8 nested if. 

Αν είναι αυτό ολο το θέμα της εργασίας,  κανε ένα html form που θα ζητάς ημερομηνία και στο submit να καλείς ενα php αρχείο που θα επιστρέφει το ανάλογο μήνυμα. 

Αν είναι μέρος μεγαλύτερης εργασίας,  και θες να εμφανίζεται αυτόματα σε μια ιστοσελίδα,  θα το κάνεις σε javascript και θα το βάλεις στο head του html κώδικα σου

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι περίπλόκο, προσπαθώ να εξηγήσω μια λύση που σκέφτηκα

Βάζεις τα στοιχεία σου σε μία λίστα idiotites  = [Μαθητής Α' γυμνασίου, Μαθητής Β' γυμνασίου, Μαθητής Γ' γυμνασίου, Μαθητής Α' λυκείου, Μαθητής Β' λυκείου, Μαθητής Γ' λυκείου, Απόφοιτος ] παίρνεις μετά το δείκτη i της τάξης που έγινε η εγγραφή 0 για Α γυμνασιού length του ιδιότητες -1 για απόφοιτο

Μετά έχεις το date1 από το οποίο πέρνεις το d1m το μήνα δηλαδή με αριθμό 1-12 και το d1y με αριθμό το έτος.

Το ίδιο κάνεις και για την δεύτερη ημερομηνία date2.

βρίσκεις τη διαφορά των δύο ημερομηνιών σε μήνες. Εάν το έτος είναι είναι το ίδιο είναι d2m-d1m  αλλιώς είναι 12-d1m για τον 1ο χρόνο + (d2y-d1y-1)*12 για τα πλήρη χρόνια + d2m για το μη πλήρες έτος. 

Μετά καθορίζεις ποιο μήνα αλλάζει η τάξη πχ 9o Σεπτέμβριο.

Μετά υπολογίζεις με βάση τους μήνες διαφοράς πόσες τάξεις άλαξε. Αυτές είναι το ακαίραιο κομμάτι των μηνών/12  και σου μένει και το υπόλοιπο m%12 για να βρεις αν άλλαξε +1 τάξη.

Εάν το d1m είναι μικρότερο του 9 και το d1m + ypoloipo  >= 9 έχεις +1 τάξη. Αν το d1m>=9 και το d1m+ypoloipo είναι μεγαλύτερο του 21 έχεις +1 τάξη

επιστρέφεις το ιδιότητες[i+tajeis] ή απόφοιτος.

Είναι λίγο περίπλοκο σε κώδικα όμως είναι γύρω στις 10 γράμμες.

Μόνο και ελπίζω να μην είναι real world πρόβλημα γιατί υπάρχουν πολλές περιπτώσεις που θα πάρεις λάθος αποτέλεσμα.

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωχ μου φαίνεται περίπλοκο κι ας είναι λίγες γραμμές κώδικα :(

Κάτι άλλο που σκέφτηκα: έχουμε και την ημερομηνία γεννήσεως. Άρα νομίζω ότι και μόνο με αυτή, μπορούμε να κάνουμε τις αντιστοιχήσεις αντί να ασχοληθούμε με τη μέρα που έγινε η δήλωση.

Όμως εδώ υπάρχει το εξής θέμα: κάποιοι κέρδισαν χρονιά στο σχολείο.

Για παράδειγμα εγώ που είμαι του 1989, θυμάμαι ότι στη τάξη είχαμε και μαθητές του 1990. Άρα δεν μπορούμε να βασιστούμε μόνο στο έτος γέννησης, αλλά και στους μήνες.

Κάτι μου είπαν ότι εδώ και κάποια χρόνια ο νόμος είναι πιο συγκεκριμένος, κι άρα τα παιδιά δεν κερδίζουν χρονιές. Αν αυτό ισχύει τα τελευταία 6 - 7 χρόνια που μας ενδιαφέρουν, τότε η πιθανότητα λάθους μειώνεται.

Άρα καμιά ιδέα για αλγόριθμο βάσει ημερομηνίας γέννησης που να λαμβάνει υπόψιν και το μήνα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν είναι τόσο περίπλοκο νομίζω, αρκεί να σκεφτείς πιο είναι το εμπόδιο στην επίλυση του προβλήματός σου.
Τι είναι αυτό που εμποδίζει μια απλή λύση; Το γενονός ότι μια σχολική χρονιά δε συμβαδίζει με μια ημερολογιακή χρονιά.
Δηλαδή μια σχολική χρονιά θα ξεκινήσει για παράδειγμα το έτος 2000 και θα τελειώσει το έτος 2001.
Τι μπορείς να κάνεις για να οδηγηθείς σε μια απλή λύση; Κανονικοποίηση των δεδομένων σου.
Με αυτό εννοώ ότι θα επικεντρωθείς σε ένα συγκεκριμένο σημείο της σχολικής χρονιάς, ας πούμε την έναρξη και θα κανονικοποιήσεις τα δεδομένα σου (δηλαδή τις ημ/νίες εγγραφής) με βάση αυτό.

Έστω το array των δεδομένων μαθητών που μέσα περιλαμβάνεται και το join_date ($students_array).
Για κάθε μαθητή, αν το join_date είναι πριν τη 1 Σεπτεμβρίου πχ, κράτα σαν starting_year το join_year - 1, ενώ για τους άλλους το join_year.
Κάνεις την αφαίρεση 2021 (που είναι το φετινό starting_year) - το student starting year και βρίσκεις πόσες σχολικές χρονιές έχουν περάσει από το starting_year κάθε μαθητή.

Ελπίζω να είναι κατανοητό γιατί τώρα άνοιξα τα μάτια μου και δεν έχω πιεί ακόμα καφέ 😕

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το θέμα είναι ότι μερικοί δηλώνουν την επερχόμενη τάξη τους, ακόμα και πριν την 1η Σεπτεμβρίου, ενώ το πεδίο είναι μεταβλητό κάθε χρονική στιγμή (δλδ δεν σημαίνει ότι η τιμή του πεδίου δηλώθηκε κατά την join_date). Sorry σας μπέρδεψα, μπερδεύτηκα κι εγώ. :(

Γι' αυτό είπα ότι ίσως είναι καλύτερο να βασιστούμε στην birthday_date που είναι στατικό δεδομένο. Αρκεί να μην υπάρχει το πρόβλημα του +1 / -1 χρονιά στο σχολείο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 3/10/2021 στις 2:40 ΜΜ, philos είπε

Το θέμα είναι ότι μερικοί δηλώνουν την επερχόμενη τάξη τους, ακόμα και πριν την 1η Σεπτεμβρίου, ενώ το πεδίο είναι μεταβλητό κάθε χρονική στιγμή (δλδ δεν σημαίνει ότι η τιμή του πεδίου δηλώθηκε κατά την join_date). Sorry σας μπέρδεψα, μπερδεύτηκα κι εγώ. :(

Γι' αυτό είπα ότι ίσως είναι καλύτερο να βασιστούμε στην birthday_date που είναι στατικό δεδομένο. Αρκεί να μην υπάρχει το πρόβλημα του +1 / -1 χρονιά στο σχολείο.

Εγώ από ότι καταλαβαίνω από αυτά που γράφεις δεν υπάρχουν αρκετά δεδομένα για να είσαι σίγουρος. Αν στηριχτείς στο join date θα έχεις κάποιες αστοχίες και αν στηριχτείς στο birthday date θα έχεις κάποιες άλλες, υπήρξε από την αρχή κακός σχεδιασμός.

Εκτιμώ ότι η καλύτερη λύση για εσένα είναι να τα χρησιμοποιήσεις και τα δύο (join date / birthday date) ώστε να μειώσεις τις αστοχίες.

Εγώ όταν είμαι μπερδεμένος ξεκινάω να γράφω γρήγορα με comments και pseudocode μέχρι να βρω τον βέλτιστο αλγόριθμο και μετά το γράφω κανονικά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

καλησπερα, δεν ξερω αν ελυσες το προβλημα σου , αλλα στην ουσια οπως ανεφεραν και πανω , ισως ενα object που θα περιεχει τα date ranges απο την ημερομηνια εγγραφης για καθε σχολική χρονια μετα την ιδιοτητα που δηλωσε ο χρηστης, ανεβασα και ενα αρχειο html με javascript που κανει αυτο που θες σαν παραδειγμα.

index.html

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...