Μετατροπή τύπου κειμένου σε int php. Χειρισμός τύπων δεδομένων PHP

Οι πληροφορίες αντιπροσωπεύονταν πάντα με σύμβολα. Μόνο όταν εμφανίστηκε ο προγραμματισμός έγινε εν μέρει γράμματα, αριθμοί και σημάδια (με την τυπική έννοια).

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

Συμβολοσειρές και αριθμοί

Οι χορδές είναι, πρώτα απ 'όλα, συλλογές διάφορους χαρακτήρες. ΣΕ διαφορετικά μέσαπρογραμματισμού, το κλασματικό μέρος διαχωρίστηκε από το σύνολο με διαφορετικούς τρόπους. Κάποιοι προτιμούσαν τελεία, άλλοι κόμμα (στην PHP, η μετατροπή μιας συμβολοσειράς σε αριθμό σημαίνει "."). Οι τριάδες χωρίστηκαν ενιαία απόστροφη, κόμμα ή κενό. Οι πραγματικοί αριθμοί γράφτηκαν με το γράμμα «Ε».

Όλα αυτά είναι τυπικές διαδικασίες. Τα μαθηματικά και οι αρχές λειτουργίας οποιουδήποτε επεξεργαστή ανέκαθεν αναγνώριζαν αριθμούς χωρίς διακοσμητικά στοιχεία και αντίστοιχοι πρόσθετοι επεξεργαστές έχουν αναπτυχθεί για να λειτουργούν με πραγματικές τιμές.

Αλλά ένας κόσμος μεταβλητών συγκεκριμένου τύπου(για προγράμματα πρώιμης εποχής) και η εφαρμογή της σύγχρονης ιδέας της συναίνεσης όλων των τύπων δεδομένων σημαίνει: στην PHP, η μετατροπή μιας συμβολοσειράς σε αριθμό είναι το ίδιο με το να μην κάνεις τίποτα. ΣΕ το καλύτερο σενάριοΗ PHP θα "κόψει", ή πιο συγκεκριμένα, θα την κάνει 0 ή αριθμό, εάν υπάρχει τουλάχιστον ένα ψηφίο στη συμβολοσειρά πηγής. Όλα τα ψηφία μέχρι τον πρώτο μη-ψήφιο χαρακτήρα θα αθροίζονται σε αυτόν τον αριθμό.

Γενικός κανόνας μετατροπής

Στην PHP, η μετατροπή μιας συμβολοσειράς σε αριθμό, εκτός εάν ο προγραμματιστής έχει ορίσει διαφορετικά, πραγματοποιείται αυτόματα τη στιγμή της εφαρμογής. Εάν μια μεταβλητή περιέχει μόνο αριθμούς και μια τελεία, τότε μπορεί να ληφθεί ένας πραγματικός αριθμός. Εάν ένα κόμμα εμφανίζεται σε μια ακολουθία αριθμών, τότε ό,τι έρχεται πριν από αυτό θα ερμηνευτεί ως αριθμός, φυσικά, ακέραιος.

Οποιοσδήποτε μη αριθμητικός χαρακτήρας στην ακολουθία ψηφίων σταματά τη διαδικασία και το αποτέλεσμα είναι Μετατροπές PHPΤο "string to number" θα είναι μόνο η τιμή που σχηματίστηκε πριν από τον πρώτο μη-ψήφιο χαρακτήρα.

Μαθηματικά και επεξεργασία συμβόλων

Το πιο δύσκολο, το πρώτο ή το δεύτερο, ακόμη και από την άποψη των τύπων που δεν χωρούν στη σελίδα, εντυπωσιακοί πίνακες, γραφήματα που μερικές φορές ούτε οι συγγραφείς δεν μπορούν να ξεμπερδέψουν, παράγωγα ολοκληρωμάτων, διαφορικά ολοκληρωμάτων και πολυωνύμων της nης γενιάς , είναι πολύ απλό να πούμε: η κοινωνία, φυσικά, τιμά τα πλεονεκτήματα των μαθηματικών και των μαθηματικών, αλλά η επεξεργασία των συμβόλων είναι πιο σημαντική, πιο περίπλοκη και καλύπτει τα μαθηματικά σαν πάπλωμα, παρέχοντας ένα περίεργο μυαλό που δεν μπορεί να υπερβεί τη μαγεία του αριθμοί, ένα ευνοϊκό περιβάλλον για τη δημιουργικότητα.

Συνήθως επάνω Συμβολοσειρά PHPμετατρέπεται αυτόματα σε αριθμό, αλλά δεν είναι ποτέ κακή ιδέα να το ελέγξετε. Είναι καλύτερο να είστε πάντα σίγουροι ότι η PHP κατανοεί σωστά ότι μια δεδομένη μεταβλητή είναι ένας αριθμός. Εάν υπάρχει έστω και μια σκιά αμφιβολίας, θα πρέπει να καθορίσετε ρητά τον τύπο της μεταβλητής (int) ή (float) πριν από την τιμή και να ελέγξετε πώς η PHP κατανοεί τον τύπο μεταβλητές συναρτήσεις is_integer() ή is_float().

Σύγχρονες τάσεις προγραμματισμού

Η κλασική ερμηνεία του προβλήματος "string to number" της PHP βρίσκεται μέσα στις αναπαραστάσεις σύγχρονο προγραμματισμό. Αντίστροφη διαδικασίαέχει σημαντικά περισσότερες διαφορετικές επιλογές. Λειτουργίες number_format(), printf(), sprintf() μπορούν να κάνουν θαύματα, όχι μόνο στο επίπεδο ενός αριθμού, αλλά και σε μια ομάδα αριθμών.

Μετατροπή σε PHP" γραμμή προς αριθμό" δείχνει, μάλλον, ότι μπορούμε να το κάνουμε και αυτό, αλλά το mτα μαθηματικά και οι αριθμητικοί υπολογισμοί δεν είναι το δυνατό μας σημείο.

Η σύνταξη αξιοπρεπούς και αξιόπιστης λειτουργικότητας που υλοποιεί αυτήν ή την επεξεργασία αριθμών στην PHP δεν αποτελεί πρόβλημα και το αποτέλεσμα δεν θα είναι χειρότερο από το αποτέλεσμα από περισσότερες μαθηματικές γλώσσες. Η PHP είναι, πρώτα απ 'όλα, μια γλώσσα διακομιστή, μια γλώσσα για την επεξεργασία πληροφοριών, συμπεριλαμβανομένων των μαθηματικών πληροφοριών.

Έχω μια εφαρμογή που αγγίζει πελάτες από όλο τον κόσμο και φυσικά θέλω οτιδήποτε μπαίνει στις βάσεις δεδομένων μου να κωδικοποιείται σε UTF-8.

Το κύριο πρόβλημα για μένα είναι ότι δεν ξέρω ποια θα είναι η κωδικοποίηση πηγής οποιασδήποτε συμβολοσειράς - θα μπορούσε να είναι από πεδίο κειμένου(χρήση

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

Χρειάζομαι μια συνάρτηση ή μια κλάση που να διασφαλίζει ότι τα στοιχεία που έρχονται στη βάση δεδομένων μου είναι, στο μέτρο του δυνατού, κωδικοποιημένα UTF-8. Δοκίμασα το iconv(mb_detect_encoding($text), "UTF-8", $text); αλλά αυτό έχει προβλήματα (αν η είσοδος είναι "fiancée", επιστρέφει "fianc"). Δοκίμασα πολλά πράγματα =/

Για τη μεταφόρτωση αρχείων μου αρέσει η ιδέα να ρωτήσω τελικός χρήστηςυποδεικνύουν την κωδικοποίηση που χρησιμοποιούν και δείξτε τους προεπισκόπησηγια το πώς θα μοιάζει η έξοδος, αλλά αυτό δεν βοηθάει ενάντια στους κακούς χάκερ (μπορεί να κάνει τη ζωή τους λίγο πιο εύκολη).

Έχω διαβάσει άλλες ερωτήσεις SO σχετικά με αυτό το θέμα, αλλά φαίνεται να έχουν ανεπαίσθητες διαφορές όπως "Πρέπει να αναλύσω τις ροές RSS" ή "Καταργώ δεδομένα από ιστότοπους" (ή, πράγματι, "Δεν μπορείτε") .

Κάτι όμως πρέπει να υπάρχει τουλάχιστον, καλή προσπάθεια!

9 απαντήσεις

Αυτό που ρωτάς είναι εξαιρετικά δύσκολο. Εάν είναι δυνατόν, είναι καλύτερο να ορίσετε την κωδικοποίηση στον χρήστη. Η πρόληψη μιας επίθεσης δεν χρειάζεται να είναι πολύ πιο εύκολη ή πιο δύσκολη.

Ωστόσο, μπορείτε να δοκιμάσετε:

Iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);

Ο καθορισμός μιας αυστηρής τιμής μπορεί να σας βοηθήσει να έχετε καλύτερα αποτελέσματα.

Στην πατρίδα μας τη Ρωσία έχουμε 4 δημοφιλείς κωδικοποιήσεις, επομένως η ερώτησή σας είναι πολύ δημοφιλής εδώ.

Μόνο με τους κωδικούς χαρακτήρων χαρακτήρων δεν μπορείτε να εντοπίσετε την κωδικοποίηση επειδή οι σελίδες κώδικα αλληλοκαλύπτονται. Ορισμένες σελίδες κώδικα σε διαφορετικές γλώσσεςέχουν ακόμη και πλήρη διασταύρωση. Ετσι, χρειαζόμαστε μια διαφορετική προσέγγιση.

Ο μόνος τρόπος για να εργαστείτε με άγνωστες κωδικοποιήσεις είναι να εργαστείτε με πιθανότητες. Επομένως, δεν θέλουμε να απαντήσουμε στην ερώτηση "ποια είναι η κωδικοποίηση αυτού του κειμένου;", προσπαθούμε να καταλάβουμε " ποια είναι πιθανότατα η κωδικοποίηση αυτού του κειμένου;".

Ένας τύπος από ένα δημοφιλές ρωσικό τεχνολογικό blog σκέφτηκε αυτή την προσέγγιση:

Δημιουργήστε ένα εύρος πιθανοτήτων κωδικών χαρακτήρων σε κάθε κωδικοποίηση που θέλετε να υποστηρίξετε. Μπορείτε να το φτιάξετε χρησιμοποιώντας μερικά μεγάλα κείμεναστη γλώσσα σας (π.χ. κάποια μυθοπλασία, χρησιμοποιήστε τον Σαίξπηρ για τα αγγλικά και τον Τολστόι για τα ρωσικά, lol). Θα πάρετε κάτι σαν αυτό:

Κωδικοποίηση_1: 190 => 0,095249209893009, 222 => 0,095249209893009, ... encoding_2: 239 => 0,095249209893009, 207 = 207 = 893009, 207 = 209, 209, 209, 209, 20, 20, 20, 20, 20, 20, 20, 20> 0 babilty

Περαιτέρω. Παίρνετε κείμενο σε μια άγνωστη κωδικοποίηση και για κάθε κωδικοποίηση στο "λεξικό πιθανοτήτων" αναζητάτε τη συχνότητα κάθε χαρακτήρα στο κείμενο με την άγνωστη κωδικοποίηση. Συνολική πιθανότητα συμβόλων. Κωδικοποίηση με υψηλή βαθμολογία, είναι μάλλον ο νικητής. Τα καλύτερα αποτελέσματα για μεγάλα κείμενα.

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

Btw. Το mb_detect_encoding σίγουρα δεν λειτουργεί. Ναι, γενικά. Ρίξε μια ματιά σε παρακαλώ πηγή mb_detect_encoding στο "ext/mbstring/libmbfl/mbfl/mbfl_ident.c".

Μάλλον το έχετε δοκιμάσει, αλλά γιατί να μην χρησιμοποιήσετε απλώς τη συνάρτηση mb_convert_encoding; Θα προσπαθήσει να προσδιορίσει αυτόματα το σύνολο χαρακτήρων του παρεχόμενου κειμένου ή μπορείτε να το μεταβιβάσετε σε μια λίστα.

Επιπλέον, προσπάθησα να τρέξω:

$text = "αρραβωνιαστικιά"; echo mb_convert_encoding($text, "UTF-8"); ηχώ "

"; echo iconv(mb_detect_encoding($text), "UTF-8", $text);

και τα αποτελέσματα είναι ίδια και για τα δύο. Πώς βλέπετε το κείμενό σας να περικόπτεται σε "αρραβωνιαστικός"; είναι στη βάση δεδομένων ή στο πρόγραμμα περιήγησης;

Είναι αδύνατο να προσδιοριστεί μια κωδικοποίηση συμβολοσειράς που να είναι απολύτως ακριβής. Υπάρχουν τρόποι για να προσπαθήσετε να μαντέψετε την κωδικοποίηση. Μία από αυτές τις μεθόδους, και πιθανώς/προς το παρόν η καλύτερη στην PHP, είναι η mb_detect_encoding(). Αυτό σαρώνει τη συμβολοσειρά σας και αναζητά περιστατικά πράγματα μοναδικά για συγκεκριμένες κωδικοποιήσεις. Ανάλογα με τη συμβολοσειρά σας μπορεί να μην υπάρχουν τέτοιες διακριτές περιπτώσεις.

Πάρτε την κωδικοποίηση ISO-8859-1 και ISO-8859-15 (http://en.wikipedia.org/wiki/ISO/IEC_8859-15#Changes_from_ISO-8859-1)

Υπάρχουν μόνο μερικοί διαφορετικοί χαρακτήρες, και για να γίνουν χειρότεροι, αντιπροσωπεύονται από τα ίδια byte. Είναι αδύνατο να ανακαλύψετε, με δεδομένη μια συμβολοσειρά χωρίς να γνωρίζετε την κωδικοποίησή της, εάν το byte 0xA4 πρέπει να αντιπροσωπεύει το ¤ ή το € στη συμβολοσειρά σας, επομένως δεν υπάρχει τρόπος να μάθετε την ακριβή κωδικοποίησή του.

(Σημείωση: θα μπορούσατε να προσθέσετε ένα ανθρώπινο στοιχείο ή μια ακόμη πιο προηγμένη μέθοδο σάρωσης (όπως αυτό που προτείνει ο Oroboros102) για να προσπαθήσετε να καταλάβετε, βάσει του περιβάλλοντος περιβάλλοντος, εάν ο χαρακτήρας θα πρέπει να είναι ¤ ή €, αν και αυτό φαίνεται επίσης σαν γέφυρα μακριά)

Υπάρχουν πιο ευδιάκριτες διαφορές μεταξύ, για παράδειγμα, του UTF-8 και του ISO-8859-1, επομένως αξίζει να προσπαθήσετε να το καταλάβετε όταν δεν είστε σίγουροι, αν και μπορείτε και δεν πρέπει να βασίζεστε στο ότι είναι σωστό.

Υπάρχουν άλλοι τρόποι για να διασφαλίσετε τη σωστή κωδικοποίηση. Όσον αφορά τις φόρμες, προσπαθήστε να επιβάλετε το UTF-8 όσο το δυνατόν περισσότερο (ελέγξτε το Snowman για να βεβαιωθείτε ότι θα αντιπροσωπεύετε το UTF-8 σε κάθε πρόγραμμα περιήγησης: http://intertwingly.net/blog/2010/07/29/Rails-and- Χιονάνθρωποι) Αυτό γίνεται έτσι ώστε τουλάχιστον να είστε σίγουροι ότι κάθε κείμενο που υποβάλλεται μέσω των φορμών σας είναι utf_8. Για αρχεία που έχετε λάβει, δοκιμάστε να εκτελέσετε εντολή unix"αρχείο -i" σε αυτό, για παράδειγμα. exec() (αν είναι δυνατόν στον διακομιστή σας) για να βοηθήσετε την ανακάλυψη (χρησιμοποιώντας την προδιαγραφή εγγράφου). Όσον αφορά τα δεδομένα απόξεσης, μπορείτε να διαβάσετε τις κεφαλίδες HTTP, οι οποίες συνήθως καθορίζουν την κωδικοποίηση. Κατά την ανάλυση αρχεία XMLδείτε Εάν τα μεταδεδομένα XML περιέχουν ορισμό συνόλου χαρακτήρων.

Αντί να προσπαθείτε να μαντέψετε αυτόματα την κωδικοποίηση, θα πρέπει πρώτα να προσπαθήσετε να παρέχετε μόνοι σας τη συγκεκριμένη κωδικοποίηση, εάν είναι δυνατόν, ή να προσπαθήσετε να λάβετε τον ορισμό από την πηγή από την οποία τον λαμβάνετε (εάν υπάρχει) πριν καταφύγετε στον εντοπισμό.

Το κύριο πρόβλημα για μένα είναι ότι δεν ξέρω ποια θα είναι η κωδικοποίηση πηγής οποιασδήποτε συμβολοσειράς - θα μπορούσε να είναι από ένα πεδίο κειμένου (χρήσιμο μόνο εάν ο χρήστης έχει υποβάλει πράγματι τη φόρμα) ή θα μπορούσε να είναι από ένα φορτωμένο κείμενο αρχείο, οπότε πραγματικά δεν μπορώ να ελέγξω την είσοδο.

Δεν νομίζω ότι αυτό είναι πρόβλημα. Η εφαρμογή γνωρίζει την πηγή εισόδου. Εάν είναι από μια φόρμα, χρησιμοποιήστε την κωδικοποίηση UTF-8 στην περίπτωσή σας. Δουλεύει. Απλώς βεβαιωθείτε ότι τα δεδομένα που παρέχονται είναι κωδικοποιημένα σωστά (ελέγξτε). Λάβετε υπόψη ότι δεν υποστηρίζουν πλήρως όλες οι βάσεις δεδομένων το UTF-8.

Εάν είναι αρχείο, δεν θα το αποθηκεύσετε σε κωδικοποίηση UTF-8 στη βάση δεδομένων, αλλά σε δυαδική μορφή. Όταν εξάγετε ξανά το αρχείο, χρησιμοποιήστε επίσης δυαδική έξοδο, τότε θα είναι εντελώς διαφανές.

Η ιδέα σας είναι καλό ότι ο χρήστης μπορεί να πει την κωδικοποίηση εάν μπορεί να πει μετά τη λήψη του αρχείου ούτως ή άλλως, καθώς είναι δυαδικό.

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

Grim, υπάρχουν μερικές πολύ καλές απαντήσεις και απόπειρες να απαντηθούν στην ερώτησή σου εδώ. Θα ήθελα να ευχαριστήσω όλους για τις απαντήσεις τους. Είναι πανέμορφα. Δεν είμαι κύριος κωδικοποίησης, αλλά κατανοώ την επιθυμία σας να έχετε μια καθαρή στοίβα UTF-8 στη βάση δεδομένων σας. Χρησιμοποιώ MySQL utf8mb4 για πίνακες, πεδία και συνδέσεις.

Η κατάστασή μου κατέληξε σε "Θέλω απλώς τα απολυμαντικά, τα επικυρωτικά, την επιχειρηματική λογική και τις έτοιμες δηλώσεις μου να χειρίζονται το UTF-8 όταν τα δεδομένα προέρχονται από Φόρμες HTMLή συνδέσμους για εγγραφή ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗΛοιπόν, νομίζω ότι ξεκίνησα με αυτήν την ιδέα:

  • Προσπάθεια ανίχνευσης κωδικοποίησης: $encodings = ["UTF-8", "ISO-8859-1", "ASCII"];
  • Εάν η κωδικοποίηση δεν μπορεί να εντοπιστεί, ρίξτε νέο RuntimeException
  • Εάν η είσοδος είναι UTF-8, συνεχίστε.
  • Διαφορετικά αν είναι ISO-8859-1 ή ASCII

    ΕΝΑ. Προσπάθεια μετατροπής σε UTF-8 (σε εκκρεμότητα, δεν έχει ολοκληρωθεί)

    σι. Προσδιορίστε την κωδικοποίηση της τιμής που μετατράπηκε

    Με. Εάν η αναφερόμενη κωδικοποιημένη και μετατραπείσα τιμή είναι UTF-8, προχωρήστε.

    ε. Διαφορετικά, ρίξτε νέο RuntimeException

Από το δικό μου αφηρημένη τάξηΑπολυμαντικό

Ιδιωτική συνάρτηση isUTF8($encoding, $value) (​return (($encoding === "UTF-8") && (utf8_encode(utf8_decode($value)) === $value)); ) ιδιωτική συνάρτηση utf8tify( &$ value) ($encodings = ["UTF-8", "ISO-8859-1", "ASCII"]; mb_internal_encoding("UTF-8"); mb_substitute_character(0xfffd); //ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΧΑΡΑΚΤΗΡΑ mb_detect_order( $stringEncoding = mb_detect_encoding($value, $encodings, true, if (!$stringEncoding) $this-> isUTF8($stringEncoding, $value)) ( return; ) other ( $value = mb_convert_encoding($value, "UTF-8", $stringEncoding); $stringEncoding = mb_detect_encoding($value, $encodings, true) ; if ($ this->isUTF8($stringEncoding, $value)) ( return; ) else ( $value = null; ρίξε νέο \RuntimeException("Δεν είναι δυνατή η μετατροπή της κωδικοποίησης χαρακτήρων από ISO-8859-1 ή ASCII σε UTF). -8 σε απολυμαντικό."); ) ) επιστροφή;)

Θα μπορούσε να προβληθεί ένα επιχείρημα ότι πρέπει να αποσυνδέσω τις ανησυχίες κωδικοποίησης από την αφηρημένη τάξη Sanitizer και απλώς να εισαγάγω ένα αντικείμενο Encoder σε μια συγκεκριμένη παρουσία θυγατρικού Sanitizer. Ωστόσο, το κύριο πρόβλημα με την προσέγγισή μου είναι ότι, χωρίς καμία γνώση, απορρίπτω τύπους κωδικοποίησης που δεν χρειάζομαι (και βασίζομαι σε Συναρτήσεις PHP mb_*). Χωρίς περαιτέρω μελέτη, δεν μπορώ να ξέρω αν κάποιοι άνθρωποι έχουν πληγωθεί ή όχι (ή αν χάνω σημαντικές πληροφορίες). Πρέπει λοιπόν να μάθω περισσότερα. Βρήκα αυτό το άρθρο.

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

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

ΣΕ PHP εργασίαμε ημερομηνία, συναντά συχνότερα το UNIX TIMESTAMP. Εδώ ο χρόνος αποθηκεύεται ως ακέραιος αριθμός. Ο υπολογισμός του χρόνου αρχίζει την 1η Ιανουαρίου 1970. Επομένως, για παράδειγμα, η ημερομηνία και η ώρα 12/11/2014 19:40:00 θα αντιπροσωπευόταν με τον αριθμό 1418316000. Αυτός ο αριθμός δείχνει πόσα δευτερόλεπτα έχουν περάσει από την ημερομηνία μηδέν της 1ης Ιανουαρίου 1970, που ονομάζεται Εποχή Unix.

Ένα παράδειγμα σελίδας PHP που παρέχει δυνατότητες μετατροπής δεδομένων παρουσιάζεται στον ιστότοπο ενότητα προγραμμάτωνπρόγραμμα "Μορφή μετατροπής ημερομηνίας και ώρας". Εδώ μπορείτε να δημιουργήσετε επιθυμητή ημερομηνίαστη μορφή UNIX TIMESTAMP, καθώς και σε μια τυπική, αναγνώσιμη από τον άνθρωπο μορφή.

Λήψη της τρέχουσας ώρας και ημερομηνίας στην PHP

Για να λάβετε την τρέχουσα ώρα διακομιστή, χρησιμοποιήστε τη λειτουργία

int time (άκυρο)

που θα επιστρέψει την τιμή σε μορφή timestamp unix.

echo time(); // εξαγωγή τρέχουσας ώρας σε μορφή timestamp unix

Με την πρώτη ματιά, αυτή δεν είναι μια πολύ βολική μορφή για ένα άτομο, αλλά, όπως γνωρίζετε, από απλούστερη παρουσίασηδεδομένα, τόσο πιο γρήγορα ο υπολογιστής επεξεργάζεται αυτές τις τιμές. Επιπλέον, η αποθήκευση ενός αριθμού σε μια βάση δεδομένων είναι πολύ πιο οικονομική από οποιαδήποτε ειδική μορφή. Επίσης, η PHP λειτουργεί το ίδιο με την πάροδο του χρόνου και στο Unix και στο Unix πλατφόρμα Windows, που καθιστά δυνατή τη χρήση του κώδικα σε οποιαδήποτε από αυτές τις πλατφόρμες.

Μετατροπή μορφής ημερομηνίας και ώρας σε PHP

Ο απλούστερος μηχανισμός για τη μετατροπή μιας αριθμητικής τιμής ημερομηνίας σε πιο κατανοητές τιμές παρέχεται από τη συνάρτηση:

array getdate()

Επιστρέφει έναν συσχετιστικό πίνακα που περιέχει πληροφορίες ημερομηνίας. Εάν δεν έχει καθοριστεί η παράμετρος χρονικής σήμανσης, θα επιστραφεί η τρέχουσα ώρα. Αυτός ο πίνακας περιέχει τις ακόλουθες τιμές:

Ο πίνακας που προκύπτει σάς επιτρέπει να εμφανίσετε τις τιμές στην επιθυμητή μορφή:

$ημερομηνία = 1418372345;
$date_mas = getdate($date);
echo $date_mas["mday" ] . ". ". $date_mas["mon" ] . ". ". $date_mas["year" ]; // 12.12.2014


Μπορείτε επίσης να χρησιμοποιήσετε τη λειτουργία για να μετατρέψετε τη μορφή ημερομηνίας και ώρας:

ημερομηνία συμβολοσειράς (string $template [, int $unix_timestamp])

Προορίζεται για τη λήψη του ρεύματος ημερομηνίες unixχρονική σήμανση στην απαιτούμενη μορφή. Η παράμετρος συμβολοσειράς $template καθορίζει τη μορφή εξόδου. Η παράμετρος $unix_timestamp μπορεί να χρησιμοποιηθεί για να καθορίσετε ποια χρονική τιμή θα εργαστείτε. Είναι προαιρετικό, οπότε αν δεν προσδιορίζεται θα χρησιμοποιηθεί Η τρέχουσα ημερομηνίακαι του χρόνου.

Η μορφή καθορίζεται από τις ακόλουθες τιμές:

ένα"πριν" και "μετά" το μεσημέρι: "πμ" ή "μμ"
ΕΝΑ«πριν» και «μετά» το μεσημέρι με κεφαλαία γράμματα: "Π.μ. ή μ.μ"
ρεημέρα του μήνα με 2 ψηφία (αν είναι μικρότερο από 10, το μηδέν έρχεται πρώτο) (01 έως 31)
ρεημέρα της εβδομάδας με 3 γράμματα. Για παράδειγμα, "Δευτέρα" (Δευτέρα)
ιημέρα του μήνα, 1-2 ψηφία χωρίς αρχικά μηδενικά (από 1 έως 31)
φάόνομα του μήνα. Για παράδειγμα, "Ιανουάριος"
ηώρα, 12ωρη μορφή (01 έως 12)
Hώρα, 24ωρη μορφή (00 έως 23)
σολμορφή ώρας, 12 ωρών χωρίς μηδενικά (1 έως 12)
σολωριαία, 24ωρη μορφή χωρίς μηδενικά (0 έως 23)
Εγώλεπτά (00 έως 59)
I (κεφαλαίο i)1 εάν ισχύει η θερινή ώρα, διαφορετικά 0
μεγάλο1 εάν το έτος είναι δίσεκτο ή 0 εάν δεν είναι δίσεκτο έτος
σιώρα σε μορφή ώρας Διαδικτύου ( εναλλακτικό σύστημααντίστροφη μέτρηση ώρας της ημέρας) (από 000 έως 999)
Τζώνη ώρας υπολογιστή. Για παράδειγμα, MDT
l (πεζό L)ημέρα της εβδομάδας. Για παράδειγμα, "Δευτέρα"
Μμήνας, δύο ψηφία με μηδενικά (01 έως 12)
nμήνας, ένα ή δύο ψηφία χωρίς μηδενικά (από 1 έως 12)
Μσυντομευμένο όνομα του μήνα. Για παράδειγμα, "Jan"
tαριθμός ημερών στον καθορισμένο μήνα (από 28 έως 31)
μικρόδευτερόλεπτα (0 έως 59)
μικρόΑγγλικό επίθημα τακτικού αριθμού δύο γραμμάτων ("st", "nd", "rd" ή "th")
Uακέραιος αριθμός δευτερολέπτων από την έναρξη της εποχής του UNIX
yέτος, ψηφιακό, 2 ψηφία (14)
Υέτος, ψηφιακό, 4ψήφιο (2014)
zτακτικός αριθμός της ημέρας του έτους (από 0 έως 365)
Ζμετατόπιση ζώνης ώρας σε δευτερόλεπτα (από -43200 έως 43200)
Νσειριακός αριθμόςημέρες της εβδομάδας από 1 (Δευτέρα) έως 7 (Κυριακή) σύμφωνα με το πρότυπο ISO-8601, (προστέθηκε στο εκδόσεις PHP 5.1.0)
wαύξων αριθμός της ημέρας της εβδομάδας από 0 (Κυριακή) έως 6 (Σάββατο)
Wσειριακός αριθμός της εβδομάδας του έτους σύμφωνα με το πρότυπο ISO-8601· οι εβδομάδες ξεκινούν τη Δευτέρα (προστέθηκε στην PHP 4.1.0)
οαριθμός έτους σύμφωνα με το πρότυπο ISO-8601. Έχει την ίδια έννοια με το Y, εκτός εάν ο αριθμός της εβδομάδας ISO (W) είναι από το προηγούμενο ή το επόμενο έτος. τότε θα χρησιμοποιηθεί το έτος εκείνης της εβδομάδας. (προστέθηκε στην PHP 5.1.0)
μικωδικός κλίμακας ζώνης ώρας. Για παράδειγμα: UTC, GMT, Atlantic/Azores (προστέθηκε στην PHP 5.1.0)
Οδιαφορά με την ώρα του Γκρίνουιτς, σε ώρες. Για παράδειγμα: +0200
Πδιαφορά από τη μέση ώρα του Γκρίνουιτς με άνω και κάτω τελεία μεταξύ ωρών και λεπτών. Για παράδειγμα: +02:00 (προστέθηκε στην PHP 5.1.3)
ντοημερομηνία σε τυπική μορφή ISO 8601 Για παράδειγμα, 2014-12-15:19:21+00:00 (προστέθηκε σε PHP 5)
rημερομηνία σε » μορφή RFC 2822 Για παράδειγμα: Πέμ, 21 Δεκεμβρίου 2000 16:01:07 +0200.
Uαριθμός δευτερολέπτων που έχουν περάσει από την αρχή της Εποχής του Unix (The Unix Epoch, 1 Ιανουαρίου 1970 00:00:00 GMT)

Όπως μπορείτε να δείτε από τη λίστα, μπορείτε να λάβετε πολλά χρήσιμα δεδομένα ημερομηνίας χρησιμοποιώντας αυτήν τη λειτουργία. Για παράδειγμα:

$ημερομηνία = 1418372345; // αρχική ημερομηνία και ώρα 12/12/2014 11:19:05

echo date("d.m.Y" , $date); // 12.12.2014 (ημερομηνία)
echo date("H:i:s" , $date); // 11:19:05 (ώρα)
echo date("H:i" , $date); // 11:19 (ώρα)
echo date("t" , $date); // 31 (αριθμός ημερών σε ένα μήνα)
echo date("z" , $date); // 345 (τακτικός αριθμός της ημέρας του έτους)
echo date("l dS \of F Y h:i:s A" , $date); // Παρασκευή 12 Δεκεμβρίου 2014 11:19:05 π.μ

Οι άλλοι χαρακτήρες που περιλαμβάνονται στο μοτίβο θα εκτυπωθούν όπως είναι στη γραμμή. Εάν πρέπει να εισαγάγετε έναν χαρακτήρα που χρησιμοποιείται στη συνάρτηση ως κωδικός μορφής, ο χαρακτήρας "\" εισάγεται μπροστά τους. Για την τιμή "\n" (ο χαρακτήρας μετάβασης νέα γραμμή), θα πρέπει να καθορίσετε "\\n". Έτσι, μπορείτε να εξάγετε ένα ολόκληρο μήνυμα που περιέχει πληροφορίες ημερομηνίας και ώρας:

ημερομηνία ηχούς ( "Σήμερα z-η ημέρα Y έτος", $date); // Σήμερα είναι η 345η ημέρα του 2014

Μετατροπή ημερομηνίας και ώρας σε μορφή χρονικής σφραγίδας

Για να αντιστρέψετε τη μετατροπή ημερομηνίας από τυπική μορφήΗ συνάρτηση εφαρμόζεται στην τιμή της αριθμητικής χρονικής σφραγίδας:

int mktime(]]]]]]

Η συνάρτηση mktime() επιστρέφει την τιμή χρόνου Unix που αντιστοιχεί στην ημερομηνία και ώρα που καθορίζονται από τα ορίσματά της. Για παράδειγμα:

$my_date = mktime(10, 30, 0, 12, 12, 2014);

Θα πρέπει να προσέχετε τη σειρά των ορισμάτων συνάρτησης: ώρες, λεπτά, δευτερόλεπτα, μήνας, ημέρα, έτος.

Εκτός απλός σχηματισμόςτιμές ημερομηνίας στη χρονική σήμανση, η συνάρτηση mktime() μπορεί να χρησιμοποιηθεί για την αριθμητική εκτέλεση με ημερομηνίες. Για να το κάνετε αυτό, μπορείτε απλώς να εισαγάγετε τα απαραίτητα ορίσματα. Για παράδειγμα, εάν καθορίσετε τον 14ο μήνα, τότε στην τελική τιμή, ο μήνας θα είναι ο 2ος και η τιμή του έτους θα αυξηθεί κατά ένα:

$my_day = 12;
$my_month = 12;
$my_year = 2014;

$new_date = mktime(0, 0, 0, $my_month + 5, $my_day, $my_year);

echo date("d.m.Y" , $new_date); // 05/12/2015 (ημερομηνία)

Μπορείτε να κάνετε το ίδιο με άλλες παραμέτρους.

Έλεγχος εγκυρότητας ημερομηνίας στην PHP

Όταν εργάζεστε με ημερομηνίες, ειδικά όταν δημιουργείτε μια ημερομηνία χρησιμοποιώντας τη συνάρτηση mktime() που προτείνεται παραπάνω, είναι απαραίτητο να λάβετε υπόψη την ορθότητα της καταχωρημένης ημερομηνίας. Για να γίνει αυτό, η PHP χρησιμοποιεί τη συνάρτηση:

ημερομηνία ελέγχου bool (int μήνα, int ημέρα, int έτος)

Επιστρέφει true εάν η ημερομηνία που καθορίζεται από τα ορίσματα είναι σωστή. αλλιώς επιστρέφει ψευδής. Η ημερομηνία θεωρείται σωστή εάν:

Έτος στην περιοχή από 1 έως 32767.

Ο μήνας κυμαίνεται από 1 έως 12.

Η ημέρα για έναν δεδομένο μήνα, λαμβάνοντας υπόψη τα δίσεκτα έτη, υποδεικνύεται σωστά.

Παράδειγμα ελέγχου ημερομηνίας:

$my_day = 32;
$my_month = 12;
$my_year = 2014;

if (!checkdate($my_month, $my_day, $my_year))
ηχώ "Σφάλμα: η ημερομηνία είναι λανθασμένη";

Η PHP δεν απαιτεί (ή υποστηρίζει) ρητό ορισμό τύπου όταν δηλώνει μια μεταβλητή. ο τύπος μιας μεταβλητής καθορίζεται ανάλογα με το πλαίσιο στο οποίο χρησιμοποιείται. Δηλαδή, εάν αντιστοιχίσετε μια τιμή συμβολοσειράς στο $var , το $var θα γίνει συμβολοσειρά. Εάν στη συνέχεια αντιστοιχίσετε στο $var μια ακέραια τιμή, γίνεται ακέραιος.

Ένα παράδειγμα αυτόματης μετατροπής τύπου είναι ο τελεστής προσθήκης " + ". Εάν κάποιος από τους τελεστές είναι αριθμός κινητής υποδιαστολής, τότε όλοι οι τελεστές ερμηνεύονται ως αριθμοί κινητής υποδιαστολής, το αποτέλεσμα θα είναι επίσης αριθμός κινητής υποδιαστολής. Διαφορετικά, οι τελεστές θα ερμηνεύονται ως ακέραιοι και το αποτέλεσμα θα είναι επίσης ένας αριθμός ακέραιος αριθμός Σημειώστε ότι αυτό ΔΕΝ αλλάζει τους τύπους των ίδιων των τελεστών Μερικά πρακτικά παραδείγματα.

$foo = "0" ; // Το $foo είναι μια συμβολοσειρά (ASCII 48)
$foo += 2 ; // Το $foo είναι τώρα ένας ακέραιος αριθμός (2)
$foo = $foo + 1,3 ; // Το $foo είναι πλέον float (3.3)
$foo = 5 + "10 Μικρά Γουρουνάκια" ; // Το $foo είναι ακέραιος αριθμός (15)
$foo = 5 + "10 μικρά γουρούνια" ; // Το $foo είναι ακέραιος αριθμός (15)
?>

Εάν θέλετε να δοκιμάσετε οποιοδήποτε από τα παραδείγματα που παρέχονται στο αυτός ο τομέας, μπορείτε να χρησιμοποιήσετε τη λειτουργία var_dump() .

Προσοχή: -1 μετράει ΑΛΗΘΗΣ, όπως κάθε μη μηδενικός (αρνητικός ή θετικός) αριθμός!

Παραδείγματα μετασχηματισμών:

var_dump ((bool) "" ); // bool(false)
var_dump ((bool) 1 ); //bool(true)
var_dump ((bool) - 2 ); //bool(true)
var_dump ((bool) "foo" ); //bool(true)
var_dump ((bool) 2.3e5 ); //bool(true)
var_dump ((bool) πίνακας(12 )); //bool(true)
var_dump((bool) array()); // bool(false)
var_dump ((bool) "false" ); //bool(true)
?>

Μετατροπή από Boolean

ΨΕΥΔΗΣμετατρέπεται σε 0 (μηδέν) και ΑΛΗΘΗΣ- σε 1 (μονάδα).

Μετατροπή από Float

Κατά τη μετατροπή από αριθμό κινητής υποδιαστολής σε ακέραιο, ο αριθμός θα στρογγυλοποιείται προς το μηδέν.

Εάν το float υπερβαίνει τα όρια του ακέραιου αριθμού (συνήθως +/- 2,15e+9 = 2^31), το αποτέλεσμα θα είναι απροσδιόριστο επειδή ο ακέραιος δεν έχει αρκετή ακρίβεια για να επιστρέψει το σωστό αποτέλεσμα. Σε αυτήν την περίπτωση, δεν θα εμφανιστεί καμία προειδοποίηση ή ακόμη και παρατήρηση.

Προσοχή! Μην μετατρέπετε ποτέ ένα άγνωστο κλάσμα σε ένα σύνολο, καθώς αυτό μπορεί μερικές φορές να δώσει απροσδόκητα αποτελέσματα, για παράδειγμα:

echo (int) ((0,1 + 0,7 ) * 10 ); // εκτυπώνει 7!
?>

Μετατροπή από String

Μετατροπές από άλλους τύπους

Για άλλους τύπους, η συμπεριφορά μετατροπής σε ακέραιο είναι απροσδιόριστη. Επί του παρόντος, η συμπεριφορά είναι η ίδια σαν να ήταν η τιμή για πρώτη φορά. Ωστόσο ΔενΒασιστείτε σε αυτήν τη συμπεριφορά καθώς μπορεί να αλλάξει χωρίς προειδοποίηση.

Boolean ( boolean) νόημα ΑΛΗΘΗΣμετατρέπεται στη συμβολοσειρά "1" και την τιμή ΨΕΥΔΗΣαντιπροσωπεύεται ως "" ( κενή γραμμή). Με αυτόν τον τρόπο μπορείτε να μετατρέψετε τιμές και προς τις δύο κατευθύνσεις - από boolean τύπουσε χορδή και αντίστροφα.

Ακέραιος αριθμός ( ακέραιος αριθμός) ή αριθμός κινητής υποδιαστολής ( φλοτέρ) μετατρέπεται σε μια συμβολοσειρά που αντιπροσωπεύεται από έναν αριθμό που αποτελείται από τα ψηφία του (συμπεριλαμβανομένου του εκθέτη για αριθμούς κινητής υποδιαστολής).

Οι πίνακες μετατρέπονται πάντα στη συμβολοσειρά "Array" , επομένως δεν μπορείτε να εμφανίσετε τα περιεχόμενα του πίνακα ( πίνακας), χρησιμοποιώντας ηχώ()ή Τυπώνω()για να δούμε τι περιέχει. Για να προβάλετε ένα μεμονωμένο στοιχείο πρέπει να κάνετε κάτι σαν echo $arr["foo"] . Δείτε παρακάτω για συμβουλές σχετικά με τον τρόπο εμφάνισης/προβολής όλου του περιεχομένου.

Τα αντικείμενα μετατρέπονται πάντα στη συμβολοσειρά "Object" . Εάν θέλετε να εκτυπώσετε την τιμή της μεταβλητής μέλους ενός αντικειμένου ( αντικείμενο) Για σκοπούς εντοπισμού σφαλμάτων, διαβάστε τις ακόλουθες παραγράφους. Εάν θέλετε να λάβετε το όνομα κλάσης του απαιτούμενου αντικειμένου, χρησιμοποιήστε το get_class() .

Οι πόροι μετατρέπονται πάντα σε συμβολοσειρές με τη δομή "Resource id #1", όπου 1 είναι ο μοναδικός αριθμός πόρου ( πόρος) του ανατέθηκε από την PHP κατά το χρόνο εκτέλεσης. Εάν θέλετε να λάβετε τον τύπο πόρου, χρησιμοποιήστε το .

ΜΗΔΕΝΙΚΟμετατρέπεται πάντα στην κενή συμβολοσειρά.

Η εκτύπωση συστοιχιών, αντικειμένων ή πόρων δεν σας παρέχει κανέναν ΧΡΗΣΙΜΕΣ ΠΛΗΡΟΦΟΡΙΕΣγια τις ίδιες τις έννοιες. Ένας καλύτερος τρόπος εξαγωγής τιμών για εντοπισμό σφαλμάτων είναι η χρήση συναρτήσεων print_r()Και var_dump() .

Μπορείτε επίσης να μετατρέψετε τις τιμές PHP σε συμβολοσειρές για μόνιμη αποθήκευση. Αυτή η μέθοδος ονομάζεται σειριοποίηση και μπορεί να γίνει χρησιμοποιώντας τη συνάρτηση serialize(). Επιπλέον, εάν η εγκατάσταση PHP σας έχει υποστήριξη WDDX, μπορείτε να σειριοποιήσετε τις τιμές PHP σε δομές XML.

Μετατροπή σε τύπο πίνακα

Για οποιονδήποτε από τους τύπους: ακέραιος αριθμός, φλοτέρ, σειρά, booleanΚαι πόροςαν μετατρέψετε την τιμή σε πίνακα, θα καταλήξετε σε έναν πίνακα με ένα στοιχείο (στο δείκτη 0) να είναι η βαθμωτή τιμή με την οποία ξεκινήσατε.

Εάν μετατρέψετε ένα αντικείμενο σε πίνακα ( αντικείμενο), θα λάβετε τις ιδιότητες (μεταβλητές μέλους) αυτού του αντικειμένου ως στοιχεία πίνακα. Τα κλειδιά θα είναι τα ονόματα των μεταβλητών μελών.

Εάν μετατρέψετε την τιμή σε πίνακα ΜΗΔΕΝΙΚΟ, θα λάβετε έναν κενό πίνακα.

Μετατροπή σε τύπο αντικειμένου

Εάν ένα αντικείμενο μετατραπεί σε αντικείμενο, δεν τροποποιείται. Εάν μια τιμή οποιουδήποτε άλλου τύπου μετατραπεί σε ένα αντικείμενο, δημιουργείται μια νέα παρουσία της ενσωματωμένης κλάσης stdClass. Εάν η τιμή ήταν κενή, η νέα παρουσία θα είναι επίσης κενή. Για οποιαδήποτε άλλη τιμή, θα περιέχεται σε μια βαθμωτή μεταβλητή μέλους:

$obj = (αντικείμενο) "ciao" ;
echo $obj -> scalar ; // θα εκτυπώσει "ciao"
?>