Λειτουργίες επαναλήπτη

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

έκδοση: 4.0