Λειτουργίες επαναλήπτη
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 = /* data that cannot be iterated multiple times */
$memoized = Iterables::memoize($iterator);
// Now you can iterate $memoized multiple times without data loss
Αυτή η μέθοδος είναι χρήσιμη σε περιπτώσεις όπου πρέπει να επαναλάβετε το ίδιο σύνολο δεδομένων πολλές φορές, αλλά ο αρχικός επαναλήπτης δεν υποστηρίζει επαναλαμβανόμενη επανάληψη ή η επαναλαμβανόμενη επανάληψη θα ήταν δαπανηρή (π.χ. ανάγνωση δεδομένων από μια βάση δεδομένων ή ένα αρχείο).
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);
// Now you have an Iterator instead of an array
Αυτή η μέθοδος είναι χρήσιμη όταν πρέπει να διασφαλίσετε ότι έχετε έναν Iterator, ανεξάρτητα από τον τύπο δεδομένων εισόδου. Αυτό μπορεί να είναι χρήσιμο κατά τη δημιουργία συναρτήσεων που λειτουργούν με διαφορετικούς τύπους επαναληπτικών δεδομένων.