Εργασία με επαναλήπτες

Η 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, ανεξάρτητα από τον τύπο των δεδομένων εισόδου. Αυτό μπορεί να είναι χρήσιμο κατά τη δημιουργία συναρτήσεων που λειτουργούν με διάφορους τύπους επαναλήψιμων δεδομένων.

έκδοση: 4.0