Εργασία με επαναλήπτες
Η Nette\Utils\Iterables είναι μια στατική κλάση με συναρτήσεις για την εργασία με επαναλήπτες. Το αντίστοιχό της για πίνακες είναι η Nette\Utils\Arrays.
Εγκατάσταση:
composer require nette/utils
Όλα τα παραδείγματα προϋποθέτουν ότι έχει δημιουργηθεί ένα ψευδώνυμο:
use Nette\Utils\Iterables;
contains (iterable $iterable, $value): bool
Αναζητά την καθορισμένη τιμή στον επαναλήπτη. Χρησιμοποιεί αυστηρή
σύγκριση (===
) για την επαλήθευση της αντιστοιχίας. Επιστρέφει
true
εάν η τιμή βρεθεί, διαφορετικά false
.
Iterables::contains(new ArrayIterator([1, 2, 3]), 1); // true
Iterables::contains(new ArrayIterator([1, 2, 3]), '1'); // false
Αυτή η μέθοδος είναι χρήσιμη όταν χρειάζεται να προσδιορίσετε γρήγορα εάν μια συγκεκριμένη τιμή υπάρχει στον επαναλήπτη, χωρίς να χρειάζεται να διατρέξετε όλα τα στοιχεία χειροκίνητα.
containsKey (iterable $iterable, $key): bool
Αναζητά το καθορισμένο κλειδί στον επαναλήπτη. Χρησιμοποιεί αυστηρή
σύγκριση (===
) για την επαλήθευση της αντιστοιχίας. Επιστρέφει
true
εάν το κλειδί βρεθεί, διαφορετικά false
.
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 0); // true
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 4); // false
every (iterable $iterable, callable $predicate): bool
Επαληθεύει εάν όλα τα στοιχεία του επαναλήπτη πληρούν τη συνθήκη που
ορίζεται στο $predicate
. Η συνάρτηση $predicate
έχει την υπογραφή
function ($value, $key, iterable $iterable): bool
και πρέπει να επιστρέφει true
για κάθε στοιχείο, ώστε η μέθοδος every()
να επιστρέψει true
.
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isBelowThreshold = fn($value) => $value < 40;
$res = Iterables::every($iterator, $isBelowThreshold); // true
Αυτή η μέθοδος είναι χρήσιμη για την επαλήθευση εάν όλα τα στοιχεία σε μια συλλογή πληρούν μια συγκεκριμένη συνθήκη, για παράδειγμα, εάν όλοι οι αριθμοί είναι μικρότεροι από μια συγκεκριμένη τιμή.
filter (iterable $iterable, callable $predicate): Generator
Δημιουργεί έναν νέο επαναλήπτη που περιέχει μόνο εκείνα τα στοιχεία
από τον αρχικό επαναλήπτη που πληρούν τη συνθήκη που ορίζεται στο
$predicate
. Η συνάρτηση $predicate
έχει την υπογραφή
function ($value, $key, iterable $iterable): bool
και πρέπει να επιστρέφει true
για τα στοιχεία που πρόκειται να διατηρηθούν.
$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::filter($iterator, fn($v) => $v < 3);
// 1, 2
Η μέθοδος χρησιμοποιεί έναν γεννήτορα, πράγμα που σημαίνει ότι το φιλτράρισμα πραγματοποιείται σταδιακά κατά τη διάσχιση του αποτελέσματος. Αυτό είναι αποδοτικό από άποψη μνήμης και επιτρέπει την επεξεργασία ακόμη και πολύ μεγάλων συλλογών. Εάν δεν διατρέξετε όλα τα στοιχεία του τελικού επαναλήπτη, εξοικονομείτε υπολογιστική ισχύ, επειδή δεν επεξεργάζονται όλα τα στοιχεία του αρχικού επαναλήπτη.
first (iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed
Επιστρέφει το πρώτο στοιχείο του επαναλήπτη. Εάν καθοριστεί το
$predicate
, επιστρέφει το πρώτο στοιχείο που πληροί τη δεδομένη
συνθήκη. Η συνάρτηση $predicate
έχει την υπογραφή
function ($value, $key, iterable $iterable): bool
. Εάν δεν βρεθεί κανένα στοιχείο που
να ικανοποιεί τη συνθήκη, καλείται η συνάρτηση $else
(εάν έχει
καθοριστεί) και επιστρέφεται το αποτέλεσμά της. Εάν το $else
δεν
έχει καθοριστεί, επιστρέφεται null
.
Iterables::first(new ArrayIterator([1, 2, 3])); // 1
Iterables::first(new ArrayIterator([1, 2, 3]), fn($v) => $v > 2); // 3
Iterables::first(new ArrayIterator([])); // null
Iterables::first(new ArrayIterator([]), else: fn() => false); // false
Αυτή η μέθοδος είναι χρήσιμη όταν χρειάζεται να λάβετε γρήγορα το πρώτο στοιχείο μιας συλλογής ή το πρώτο στοιχείο που πληροί μια συγκεκριμένη συνθήκη, χωρίς να χρειάζεται να διατρέξετε ολόκληρη τη συλλογή χειροκίνητα.
firstKey (iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed
Επιστρέφει το κλειδί του πρώτου στοιχείου του επαναλήπτη. Εάν
καθοριστεί το $predicate
, επιστρέφει το κλειδί του πρώτου στοιχείου
που πληροί τη δεδομένη συνθήκη. Η συνάρτηση $predicate
έχει την
υπογραφή function ($value, $key, iterable $iterable): bool
. Εάν δεν βρεθεί κανένα
στοιχείο που να ικανοποιεί τη συνθήκη, καλείται η συνάρτηση $else
(εάν έχει καθοριστεί) και επιστρέφεται το αποτέλεσμά της. Εάν το
$else
δεν έχει καθοριστεί, επιστρέφεται null
.
Iterables::firstKey(new ArrayIterator([1, 2, 3])); // 0
Iterables::firstKey(new ArrayIterator([1, 2, 3]), fn($v) => $v > 2); // 2
Iterables::firstKey(new ArrayIterator(['a' => 1, 'b' => 2])); // 'a'
Iterables::firstKey(new ArrayIterator([])); // null
map (iterable $iterable, callable $transformer): Generator
Δημιουργεί έναν νέο επαναλήπτη εφαρμόζοντας τη συνάρτηση
$transformer
σε κάθε στοιχείο του αρχικού επαναλήπτη. Η συνάρτηση
$transformer
έχει την υπογραφή function ($value, $key, iterable $iterable): mixed
και
η τιμή επιστροφής της χρησιμοποιείται ως η νέα τιμή του στοιχείου.
$iterator = new ArrayIterator([1, 2, 3]);
$iterator = Iterables::map($iterator, fn($v) => $v * 2);
// 2, 4, 6
Η μέθοδος χρησιμοποιεί έναν γεννήτορα, πράγμα που σημαίνει ότι ο μετασχηματισμός πραγματοποιείται σταδιακά κατά τη διάσχιση του αποτελέσματος. Αυτό είναι αποδοτικό από άποψη μνήμης και επιτρέπει την επεξεργασία ακόμη και πολύ μεγάλων συλλογών. Εάν δεν διατρέξετε όλα τα στοιχεία του τελικού επαναλήπτη, εξοικονομείτε υπολογιστική ισχύ, επειδή δεν επεξεργάζονται όλα τα στοιχεία του αρχικού επαναλήπτη.
mapWithKeys (iterable $iterable, callable $transformer): Generator
Δημιουργεί έναν νέο επαναλήπτη μετασχηματίζοντας τις τιμές και τα
κλειδιά του αρχικού επαναλήπτη. Η συνάρτηση $transformer
έχει την
υπογραφή function ($value, $key, iterable $iterable): ?array{$newKey, $newValue}
. Εάν η
$transformer
επιστρέψει null
, το στοιχείο παραλείπεται. Για τα
διατηρημένα στοιχεία, το πρώτο στοιχείο του επιστρεφόμενου πίνακα
χρησιμοποιείται ως το νέο κλειδί και το δεύτερο στοιχείο ως η
νέα τιμή.
$iterator = new ArrayIterator(['a' => 1, 'b' => 2]);
$iterator = Iterables::mapWithKeys($iterator, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']
Όπως και η map()
, αυτή η μέθοδος χρησιμοποιεί έναν γεννήτορα για
σταδιακή επεξεργασία και αποδοτική διαχείριση μνήμης. Αυτό επιτρέπει
την εργασία με μεγάλες συλλογές και την εξοικονόμηση υπολογιστικής
ισχύος κατά τη μερική διάσχιση του αποτελέσματος.
memoize (iterable $iterable): IteratorAggregate
Δημιουργεί ένα περιτύλιγμα γύρω από τον επαναλήπτη, το οποίο κατά τη διάρκεια της επανάληψης αποθηκεύει προσωρινά τα κλειδιά και τις τιμές του στην κρυφή μνήμη. Αυτό επιτρέπει την επαναλαμβανόμενη επανάληψη των δεδομένων χωρίς την ανάγκη εκ νέου διάσχισης της αρχικής πηγής δεδομένων.
$iterator = /* δεδομένα που δεν μπορούν να επαναληφθούν περισσότερες από μία φορές */
$memoized = Iterables::memoize($iterator);
// Τώρα μπορείτε να επαναλάβετε το $memoized πολλές φορές χωρίς απώλεια δεδομένων
Αυτή η μέθοδος είναι χρήσιμη σε περιπτώσεις όπου χρειάζεται να διατρέξετε το ίδιο σύνολο δεδομένων πολλές φορές, αλλά ο αρχικός επαναλήπτης δεν επιτρέπει την επαναλαμβανόμενη επανάληψη ή η επαναλαμβανόμενη διάσχιση θα ήταν δαπανηρή (π.χ. κατά την ανάγνωση δεδομένων από μια βάση δεδομένων ή ένα αρχείο).
some (iterable $iterable, callable $predicate): bool
Επαληθεύει εάν τουλάχιστον ένα στοιχείο του επαναλήπτη πληροί τη
συνθήκη που ορίζεται στο $predicate
. Η συνάρτηση $predicate
έχει
την υπογραφή function ($value, $key, iterable $iterable): bool
και πρέπει να
επιστρέφει true
για τουλάχιστον ένα στοιχείο, ώστε η μέθοδος
some()
να επιστρέψει true
.
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
$isEven = fn($value) => $value % 2 === 0;
$res = Iterables::some($iterator, $isEven); // true
Αυτή η μέθοδος είναι χρήσιμη για τη γρήγορη επαλήθευση εάν υπάρχει τουλάχιστον ένα στοιχείο στη συλλογή που πληροί μια συγκεκριμένη συνθήκη, για παράδειγμα, εάν η συλλογή περιέχει τουλάχιστον έναν άρτιο αριθμό.
Δείτε every().
toIterator (iterable $iterable): Iterator
Μετατρέπει οποιοδήποτε επαναλήψιμο αντικείμενο (array, Traversable) σε Iterator. Εάν η είσοδος είναι ήδη Iterator, την επιστρέφει χωρίς αλλαγή.
$array = [1, 2, 3];
$iterator = Iterables::toIterator($array);
// Τώρα έχετε έναν Iterator αντί για έναν πίνακα
Αυτή η μέθοδος είναι χρήσιμη όταν χρειάζεται να διασφαλίσετε ότι έχετε διαθέσιμο έναν Iterator, ανεξάρτητα από τον τύπο των δεδομένων εισόδου. Αυτό μπορεί να είναι χρήσιμο κατά τη δημιουργία συναρτήσεων που λειτουργούν με διάφορους τύπους επαναλήψιμων δεδομένων.