Λειτουργίες για εργασία με πίνακες. Θεωρία συνόλων - PHP: Πίνακες - Hexlet Php τομή πινάκων ανά τιμή

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

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

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

"Υποσύνολο" σημαίνει ότι όλα τα στοιχεία ενός συνόλου περιλαμβάνονται επίσης σε ένα άλλο σύνολο, που ονομάζεται υπερσύνολο(σε σχέση με ένα υποσύνολο).

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

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

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

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

Προχωρώντας στον προγραμματισμό, θα παρατηρήσετε ότι ένας πίνακας μοιάζει πολύ με ένα σύνολο και μπορεί πράγματι να θεωρηθεί ως τέτοιος. Γιατί είναι αυτό τόσο σημαντικό; Κατανοώντας τις αρχές πίσω από ορισμένες λειτουργίες, μπορείτε να τις εφαρμόσετε με τον ταχύτερο και αποτελεσματικότερο τρόπο. Για παράδειγμα, γνωρίζοντας ότι χρειάζεστε μια συνάρτηση τομής σε php, μπορείτε να προσπαθήσετε να βρείτε μια συνάρτηση που κάνει την εργασία. Για να το κάνετε αυτό, απλώς εισάγετε το ερώτημα στο Google: Το σύνολο php τέμνεται(σύνολο - σύνολο, διασταύρωση - διασταύρωση). Ο πρώτος (τουλάχιστον για μένα) σύνδεσμος στα αποτελέσματα αναζήτησης οδηγεί στην επιθυμητή συνάρτηση array_intersect. Το ίδιο σας περιμένει και με άλλες επεμβάσεις. Αυτή είναι μια μερική απάντηση στην ερώτηση "χρειάζονται οι προγραμματιστές μαθηματικά;"

Παρεμπιπτόντως, δεν έχουν όλες οι γλώσσες ενσωματωμένες λειτουργίες για εργασία με σύνολα. Σε ορισμένες, πρέπει να εγκαταστήσετε πρόσθετες βιβλιοθήκες για αυτό, και σε ορισμένες, για παράδειγμα, στο Ruby, οι λειτουργίες με σύνολα υλοποιούνται χρησιμοποιώντας αριθμητικούς τελεστές (ένωση συνόλων: coll1 + coll2).

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

Ας δούμε τις βασικές λειτουργίες:

Σημείο τομής

Η τομή των συνόλων είναι ένα σύνολο που περιλαμβάνει στοιχεία που εμφανίζονται σε όλα τα δεδομένα σύνολα ταυτόχρονα.

["vasya", "petya"]

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

Ένας σύλλογος

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

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // μοναδικό αφαιρεί διπλότυπα $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Προσθήκη (διαφορά)

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

["kolya"]

Ανήκοντας στο πλήθος

Μπορείτε να ελέγξετε εάν ένα στοιχείο ανήκει σε ένα σύνολο χρησιμοποιώντας τη συνάρτηση in_array:

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

Λύση
Για να ορίσετε μια ένωση:
$union = array_unique(array_merge($a, $b));

Για να υπολογίσετε τη διασταύρωση:
$intersection = array_intersection($a, $b);

Για να βρείτε μια απλή διαφορά:
$difference = array_diff($a, $b);

Και για να λάβετε τη συμμετρική διαφορά (αποκλειστικά OR):

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

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

Ωστόσο, αυτό μπορεί να οδηγήσει σε κενά επειδή η συνάρτηση array_unique() δεν συμπυκνώνει τον πίνακα. Ωστόσο, αυτό δεν είναι πρόβλημα επειδή τόσο η πρόταση foreach όσο και η συνάρτηση every() χειρίζονται αραιοκατοικημένους πίνακες χωρίς παρεμβολές.

Η συνάρτηση για τον υπολογισμό της τομής ονομάζεται απλά array_intersection() και δεν απαιτεί πρόσθετη προσπάθεια.

Η συνάρτηση array_diff() επιστρέφει έναν πίνακα που περιέχει όλα τα μοναδικά στοιχεία του πίνακα $old που δεν βρίσκονται στον πίνακα $new. Αυτό ονομάζεται απλή διαφορά:


$difference = array_diff($old, $new);
Πίνακας
=> όχι
=> προς
)

Ο πίνακας $difference που προκύπτει περιέχει τα "not" και "to" επειδή η array_diff() έχει διάκριση πεζών-κεφαλαίων. Δεν περιλαμβάνει το στοιχείο "whatever" επειδή δεν βρίσκεται στον πίνακα $old.

Για να λάβετε την αντίστροφη διαφορά ή, με άλλα λόγια, για να βρείτε τα μοναδικά στοιχεία του πίνακα $new που λείπουν από τον πίνακα $old, πρέπει να αλλάξετε τα επιχειρήματα:
$old = array("To", "be", "or", "not", "to", "be");
$new = array("To", "be", "or", "whatever");
$reverse_diff = array_diff($new, $old);
Πίνακας
=> οτιδήποτε
)

Ο πίνακας $reverse_diff περιέχει μόνο το στοιχείο "whatever".

Εάν χρειάζεται να εφαρμόσετε μια συνάρτηση ή άλλο φίλτρο στη συνάρτηση array_diff(), ενσωματώστε τον δικό σας αλγόριθμο διαφοράς (αφαίρεση):

// Εφαρμόστε έναν αλγόριθμο αφαίρεσης χωρίς διάκριση πεζών-κεφαλαίων. διαφορά -i
$seen = array();
foreach ($new ως $n) (
$seen++;
}
foreach ($παλιό ως $o) (
$o = strtolower($o);
αν (!$seen[$o]) ( $diff[$o] = $o; )
}

Η πρώτη δήλωση foreach δημιουργεί έναν συσχετιστικό πίνακα για περαιτέρω αναζήτηση.

Στη συνέχεια, κάνει loop μέσω του πίνακα $old και, εάν το στοιχείο δεν βρεθεί κατά την αναζήτηση, προστίθεται στον πίνακα $diff.

Αυτή η διαδικασία μπορεί να επιταχυνθεί συνδυάζοντας τις συναρτήσεις array_diff() και array_map():

$diff = array_diff(array_map("strtolower", $old),
array_map("strtolower", $new));

Η συμμετρική διαφορά είναι τι είναι στο $a αλλά όχι στο $b, συν το τι είναι στο $b αλλά όχι στο $a:

$difference = array_merge(array_diff($a, $b), array_diff($b, $a));

Μόλις καθιερωθεί, ο αλγόριθμος προχωρά. Η συνάρτηση array_diff() καλείται δύο φορές και καθορίζει δύο διαφορές. Στη συνέχεια συνδυάζονται σε έναν πίνακα. Δεν χρειάζεται να καλέσετε την array_unique() αφού αυτοί οι πίνακες σχεδιάστηκαν ειδικά για να μην έχουν κοινά στοιχεία.

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

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

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

Εγκατάσταση

Δεν απαιτείται εγκατάσταση για τη χρήση αυτών των δυνατοτήτων καθώς αποτελούν μέρος του πυρήνα της PHP.

Προκαθορισμένες σταθερές

Οι σταθερές που αναφέρονται παρακάτω είναι πάντα διαθέσιμες ως μέρος του πυρήνα της PHP.

CASE_LOWER(ακέραιος αριθμός)

CASE_LOWERχρησιμοποιείται με λειτουργία array_change_key_case()για να υποδείξετε εάν τα πλήκτρα πίνακα πρέπει να μετατραπούν σε πεζούς χαρακτήρες. Προεπιλεγμένη λειτουργία array_change_key_case()Αυτή η σταθερά χρησιμοποιείται.

CASE_UPPER(ακέραιος αριθμός)

CASE_UPPERχρησιμοποιείται με λειτουργία array_change_key_case()για να υποδείξετε εάν τα πλήκτρα πίνακα πρέπει να μετατραπούν σε κεφαλαίους χαρακτήρες.

array_change_key_case -- Επιστρέψτε έναν πίνακα του οποίου τα πλήκτρα χαρακτήρων μετατρέπονται σε κεφαλαίους ή πεζούς χαρακτήρες array_chunk -- Διαχωρίστε έναν πίνακα σε κομμάτια array_combine -- Δημιουργήστε έναν νέο πίνακα χρησιμοποιώντας έναν πίνακα ως κλειδιά και έναν άλλο ως αντίστοιχες τιμές · array_count_values ​​- - Μετρήστε το πλήθος όλων των τιμών array_diff_assoc -- Υπολογίστε την απόκλιση πίνακα με πρόσθετο έλεγχο ευρετηρίου array_diff_key -- Υπολογίστε την απόκλιση πίνακα συγκρίνοντας τα κλειδιά array_diff_uassoc -- Υπολογίστε την απόκλιση πίνακα με πρόσθετο έλεγχο ευρετηρίου που πραγματοποιείται χρησιμοποιώντας μια συνάρτηση καθορισμένη από το χρήστη array_diff_diff_ σύγκριση κλειδιών array_diff -- Υπολογισμός απόκλισης πίνακα array_fill -- Συμπληρώστε έναν πίνακα με μια συγκεκριμένη τιμή array_filter -- Εφαρμόστε ένα φίλτρο σε έναν πίνακα χρησιμοποιώντας την επιστροφή κλήσης array_flip -- Εναλλαγή τιμών πίνακα -- Υπολογισμός τομής πίνακα συγκρίνοντας κλειδιά array_intersect_uassoc -- Υπολογισμός τομής πίνακα με πρόσθετο έλεγχο ευρετηρίου που πραγματοποιείται χρησιμοποιώντας τη συνάρτηση καθορισμένη από το χρήστη array_intersect_ukey -- Υπολογισμός τομής πίνακα με χρήση σύγκρισης κλειδιών array_intersect -- Υπολογισμός σύγκλισης πίνακα array_key_exists -- Ελέγξτε εάν το κλειδί είναι καθορισμένο -- υπάρχει στον πίνακα array_keys -- Επιλέξτε όλα τα κλειδιά στον πίνακα array_map -- Εφαρμογή συνάρτησης επανάκλησης σε όλα τα στοιχεία των καθορισμένων πινάκων array_merge_recursive -- Αναδρομική συγχώνευση δύο ή περισσότερων πινάκων array_merge -- Συγχώνευση δύο ή περισσότερων πινάκων array_multisort -- Ταξινόμηση πολλαπλών πίνακες ή πολυδιάστατοι πίνακες array_pad -- Αύξηση του μεγέθους ενός πίνακα σε μια δεδομένη τιμή array_pop -- Ανάκτηση του τελευταίου στοιχείου ενός πίνακα array_product -- Υπολογισμός του γινόμενου των τιμών του πίνακα Array_push -- Προσθήκη ενός ή περισσότερων στοιχείων στο τέλος του array_rand πίνακα -- Επιλέξτε μία ή περισσότερες τυχαίες τιμές από array_reduce -- Επαναληπτικά μειώστε έναν πίνακα σε μία τιμή χρησιμοποιώντας τη συνάρτηση επανάκλησης array_reverse -- Επιστρέφει έναν πίνακα με στοιχεία σε αντίστροφη σειρά array_search -- Αναζήτηση στον πίνακα για μια δεδομένη τιμή και επιστρέφει το αντίστοιχο κλειδί εάν είναι επιτυχές array_shift -- Ανάκτηση του πρώτου στοιχείου του πίνακα array_slice - - Επιλέξτε ένα slice ενός πίνακα array_splice -- Αφαιρέστε μια ακολουθία στοιχείων πίνακα και αντικαταστήστε την με μια άλλη ακολουθία array_sum -- Υπολογίστε το άθροισμα των τιμών του πίνακα array_udiff_assoc -- Υπολογίστε την απόκλιση σε πίνακες με πρόσθετο έλεγχο ευρετηρίου, χρησιμοποιώντας τη συνάρτηση επανάκλησης array_udiff_uassoc για σύγκριση τιμών -- Υπολογίστε την απόκλιση σε πίνακες με πρόσθετο έλεγχο ευρετηρίου, χρησιμοποιώντας τη συνάρτηση επανάκλησης array_udiff για σύγκριση τιμών και δεικτών -- Υπολογισμός απόκλιση πίνακα χρησιμοποιώντας τη συνάρτηση επανάκλησης array_uintersect_assoc για σύγκριση -- Υπολογισμός τομής πίνακα με πρόσθετο έλεγχο ευρετηρίου, χρήση της συνάρτησης επανάκλησης array_uintersect_uassoc για σύγκριση τιμών -- Υπολογισμός τομής πίνακα με πρόσθετο έλεγχο ευρετηρίου χρησιμοποιώντας το array_uintersect επανάκληση τιμών για σύγκριση δεικτών - Υπολογίστε την τομή των πινάκων χρησιμοποιώντας το array_unique callback για σύγκριση τιμών -- Αφαιρέστε τις διπλές τιμές από έναν πίνακα array_unshift -- Προσθέστε ένα ή περισσότερα στοιχεία στην αρχή του πίνακα array_values ​​-- Επιλέξτε όλες τις τιμές του array_walk_recursive -- Εφαρμόστε αναδρομικά μια προσαρμοσμένη συνάρτηση σε κάθε στοιχείο του πίνακα array_walk -- Εφαρμόστε μια προσαρμοσμένη συνάρτηση σε κάθε στοιχείο του πίνακα πίνακα -- Δημιουργήστε έναν πίνακα arsort -- Ταξινομήστε τον πίνακα με αντίστροφη σειρά, διατηρώντας τα πλήκτρα κατά σειρά - - Ταξινόμηση του πίνακα, διατηρώντας τα πλήκτρα συμπαγή - Δημιουργήστε έναν πίνακα που περιέχει ονόματα μεταβλητών και τις τιμές τους