Εργασία με πίνακες
Αυτή η σελίδα είναι αφιερωμένη στις κλάσεις Nette\Utils\Arrays, ArrayHash και ArrayList, οι οποίες αφορούν πίνακες.
Εγκατάσταση:
composer require nette/utils
Arrays
Η Nette\Utils\Arrays είναι μια στατική κλάση που περιέχει χρήσιμες συναρτήσεις για εργασία με πίνακες. Το αντίστοιχό της για επαναλήπτες είναι η Nette\Utils\Iterables.
Τα ακόλουθα παραδείγματα προϋποθέτουν τη δημιουργία ενός ψευδώνυμου:
use Nette\Utils\Arrays;
associate (array $array, mixed $path): array|\stdClass
Η συνάρτηση μετασχηματίζει ευέλικτα τον πίνακα $array
σε
συσχετιστικούς πίνακες ή αντικείμενα σύμφωνα με την καθορισμένη
διαδρομή $path
. Η διαδρομή μπορεί να είναι string ή πίνακας.
Αποτελείται από τα ονόματα των κλειδιών του πίνακα εισόδου και
τελεστές όπως ‘[]’, ‘->’, ‘=’, και ‘|’. Ρίχνει μια
Nette\InvalidArgumentException
σε περίπτωση που η διαδρομή είναι άκυρη.
// převod na asociativní pole podle jednoduchého klíče - μετατροπή σε συσχετιστικό πίνακα βάσει απλού κλειδιού
$arr = [
['name' => 'John', 'age' => 11],
['name' => 'Mary', 'age' => null],
// ...
];
$result = Arrays::associate($arr, 'name');
// $result = ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// přiřazení hodnot z jednoho klíče k jinému s použitím operátoru = - αντιστοίχιση τιμών από ένα κλειδί σε άλλο με τη χρήση του τελεστή =
$result = Arrays::associate($arr, 'name=age'); // nebo ['name', '=', 'age'] - ή ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// vytvoření objektu s použitím operátoru -> - δημιουργία αντικειμένου με τη χρήση του τελεστή ->
$result = Arrays::associate($arr, '->name'); // nebo ['->', 'name'] - ή ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// kombinace klíčů pomocí operátoru | - συνδυασμός κλειδιών με τη χρήση του τελεστή |
$result = Arrays::associate($arr, 'name|age'); // nebo ['name', '|', 'age'] - ή ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// přidání do pole s použitím [] - προσθήκη στον πίνακα με τη χρήση []
$result = Arrays::associate($arr, 'name[]'); // nebo ['name', '[]'] - ή ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]
contains (array $array, $value): bool
Ελέγχει τον πίνακα για την παρουσία μιας τιμής. Χρησιμοποιεί αυστηρή
σύγκριση (===
).
Arrays::contains([1, 2, 3], 1); // true
Arrays::contains(['1', false], 1); // false
every (array $array, callable $predicate): bool
Ελέγχει αν όλα τα στοιχεία στον πίνακα περνούν τη δοκιμή που
υλοποιείται στο $predicate
με την υπογραφή
function ($value, $key, array $array): bool
.
$array = [1, 30, 39, 29, 10, 13];
$isBelowThreshold = fn($value) => $value < 40;
$res = Arrays::every($array, $isBelowThreshold); // true
Βλέπε some().
filter (array $array, callable $predicate): array
Επιστρέφει έναν νέο πίνακα που περιέχει όλα τα ζεύγη κλειδιού-τιμής
που αντιστοιχούν στο καθορισμένο κατηγόρημα. Το callback έχει την υπογραφή
function ($value, int|string $key, array $array): bool
.
Arrays::filter(
['a' => 1, 'b' => 2, 'c' => 3],
fn($v) => $v < 3,
);
// ['a' => 1, 'b' => 2]
first (array $array, ?callable $predicate=null, ?callable $else=null): mixed
Επιστρέφει το πρώτο στοιχείο (που αντιστοιχεί στο κατηγόρημα, αν έχει
καθοριστεί). Αν δεν υπάρχει τέτοιο στοιχείο, επιστρέφει το αποτέλεσμα
της κλήσης $else
ή null. Η παράμετρος $predicate
έχει την υπογραφή
function ($value, int|string $key, array $array): bool
.
Δεν αλλάζει τον εσωτερικό δείκτη σε αντίθεση με το reset()
. Οι
παράμετροι $predicate
και $else
υπάρχουν από την έκδοση 4.0.4.
Arrays::first([1, 2, 3]); // 1
Arrays::first([1, 2, 3], fn($v) => $v > 2); // 3
Arrays::first([]); // null
Arrays::first([], else: fn() => false); // false
Βλέπε last().
firstKey (array $array, ?callable $predicate=null): int|string|null
Επιστρέφει το κλειδί του πρώτου στοιχείου (που αντιστοιχεί στο
κατηγόρημα, αν αναφέρεται) ή null, αν δεν υπάρχει τέτοιο στοιχείο. Το
κατηγόρημα $predicate
έχει την υπογραφή
function ($value, int|string $key, array $array): bool
.
Arrays::firstKey([1, 2, 3]); // 0
Arrays::firstKey([1, 2, 3], fn($v) => $v > 2); // 2
Arrays::firstKey(['a' => 1, 'b' => 2]); // 'a'
Arrays::firstKey([]); // null
Βλέπε lastKey().
flatten (array $array, bool $preserveKeys=false): array
Ενοποιεί έναν πολυεπίπεδο πίνακα σε έναν επίπεδο.
$array = Arrays::flatten([1, 2, [3, 4, [5, 6]]]);
// $array = [1, 2, 3, 4, 5, 6];
get (array $array, string|int|array $key, ?mixed $default=null): mixed
Επιστρέφει το στοιχείο $array[$key]
. Αν δεν υπάρχει, ρίχνει είτε μια
εξαίρεση Nette\InvalidArgumentException
, ή αν καθορίζεται η τρίτη παράμετρος
$default
, επιστρέφει αυτήν.
// pokud $array['foo'] neexistuje, vyhodí výjimku - αν το $array['foo'] δεν υπάρχει, ρίχνει μια εξαίρεση
$value = Arrays::get($array, 'foo');
// pokud $array['foo'] neexistuje, vrátí 'bar' - αν το $array['foo'] δεν υπάρχει, επιστρέφει 'bar'
$value = Arrays::get($array, 'foo', 'bar');
Το κλειδί $key
μπορεί επίσης να είναι πίνακας.
$array = ['color' => ['favorite' => 'red'], 5];
$value = Arrays::get($array, ['color', 'favorite']);
// vrátí 'red' - επιστρέφει 'red'
getRef (array &$array, string|int|array $key): mixed
Λαμβάνει μια αναφορά στο καθορισμένο στοιχείο του πίνακα. Αν το στοιχείο δεν υπάρχει, θα δημιουργηθεί με τιμή null.
$valueRef = & Arrays::getRef($array, 'foo');
// vrátí referenci na $array['foo'] - επιστρέφει μια αναφορά στο $array['foo']
Όπως και η συνάρτηση get(), μπορεί να δουλέψει με πολυδιάστατους πίνακες.
$value = & Arrays::getRef($array, ['color', 'favorite']);
// vrátí referenci na $array['color']['favorite'] - επιστρέφει μια αναφορά στο $array['color']['favorite']
grep (array $array, string $pattern, bool $invert=false): array
Επιστρέφει μόνο αυτά τα στοιχεία του πίνακα των οποίων η τιμή
ταιριάζει με την κανονική έκφραση $pattern
. Αν το $invert
είναι
true
, επιστρέφει αντίθετα τα στοιχεία που δεν ταιριάζουν. Σφάλμα
κατά τη μεταγλώττιση ή την επεξεργασία της έκφρασης ρίχνει μια
εξαίρεση Nette\RegexpException
.
$filteredArray = Arrays::grep($array, '~^\d+$~');
// vrátí pouze prvky pole tvořené číslicemi - επιστρέφει μόνο τα στοιχεία του πίνακα που αποτελούνται από ψηφία
insertAfter (array &$array, string|int|null $key, array $inserted): void
Εισάγει το περιεχόμενο του πίνακα $inserted
στον πίνακα $array
αμέσως μετά το στοιχείο με το κλειδί $key
. Αν το $key
είναι
null
(ή δεν είναι στον πίνακα), εισάγεται στο τέλος.
$array = ['first' => 10, 'second' => 20];
Arrays::insertAfter($array, 'first', ['hello' => 'world']);
// $array = ['first' => 10, 'hello' => 'world', 'second' => 20];
insertBefore (array &$array, string|int|null $key, array $inserted): void
Εισάγει το περιεχόμενο του πίνακα $inserted
στον πίνακα $array
πριν από το στοιχείο με το κλειδί $key
. Αν το $key
είναι
null
(ή δεν είναι στον πίνακα), εισάγεται στην αρχή.
$array = ['first' => 10, 'second' => 20];
Arrays::insertBefore($array, 'first', ['hello' => 'world']);
// $array = ['hello' => 'world', 'first' => 10, 'second' => 20];
invoke (iterable $callbacks, …$args): array
Καλεί όλα τα callbacks και επιστρέφει έναν πίνακα αποτελεσμάτων.
$callbacks = [
'+' => fn($a, $b) => $a + $b,
'*' => fn($a, $b) => $a * $b,
];
$array = Arrays::invoke($callbacks, 5, 11);
// $array = ['+' => 16, '*' => 55];
invokeMethod (iterable $objects, string $method, …$args): array
Καλεί τη μέθοδο σε κάθε αντικείμενο στον πίνακα και επιστρέφει έναν πίνακα αποτελεσμάτων.
$objects = ['a' => $obj1, 'b' => $obj2];
$array = Arrays::invokeMethod($objects, 'foo', 1, 2);
// $array = ['a' => $obj1->foo(1, 2), 'b' => $obj2->foo(1, 2)];
isList (array $array): bool
Επαληθεύει αν ο πίνακας είναι ευρετηριασμένος σύμφωνα με μια αύξουσα σειρά αριθμητικών κλειδιών από το μηδέν, γνωστός και ως λίστα.
Arrays::isList(['a', 'b', 'c']); // true
Arrays::isList([4 => 1, 2, 3]); // false
Arrays::isList(['a' => 1, 'b' => 2]); // false
last (array $array, ?callable $predicate=null, ?callable $else=null): mixed
Επιστρέφει το τελευταίο στοιχείο (που αντιστοιχεί στο κατηγόρημα, αν
έχει καθοριστεί). Αν δεν υπάρχει τέτοιο στοιχείο, επιστρέφει το
αποτέλεσμα της κλήσης $else
ή null. Η παράμετρος $predicate
έχει
την υπογραφή function ($value, int|string $key, array $array): bool
.
Δεν αλλάζει τον εσωτερικό δείκτη σε αντίθεση με το end()
. Οι
παράμετροι $predicate
και $else
υπάρχουν από την έκδοση 4.0.4.
Arrays::last([1, 2, 3]); // 3
Arrays::last([1, 2, 3], fn($v) => $v < 3); // 2
Arrays::last([]); // null
Arrays::last([], else: fn() => false); // false
Βλέπε first().
lastKey (array $array, ?callable $predicate=null): int|string|null
Επιστρέφει το κλειδί του τελευταίου στοιχείου (που αντιστοιχεί στο
κατηγόρημα, αν αναφέρεται) ή null, αν δεν υπάρχει τέτοιο στοιχείο. Το
κατηγόρημα $predicate
έχει την υπογραφή
function ($value, int|string $key, array $array): bool
.
Arrays::lastKey([1, 2, 3]); // 2
Arrays::lastKey([1, 2, 3], fn($v) => $v < 3); // 1
Arrays::lastKey(['a' => 1, 'b' => 2]); // 'b'
Arrays::lastKey([]); // null
Βλέπε firstKey().
map (array $array, callable $transformer): array
Καλεί το $transformer
σε όλα τα στοιχεία του πίνακα και επιστρέφει
έναν πίνακα επιστρεφόμενων τιμών. Το callback έχει την υπογραφή
function ($value, $key, array $array): bool
.
$array = ['foo', 'bar', 'baz'];
$res = Arrays::map($array, fn($value) => $value . $value);
// $res = ['foofoo', 'barbar', 'bazbaz']
mapWithKeys (array $array, callable $transformer): array
Δημιουργεί έναν νέο πίνακα μετασχηματίζοντας τις τιμές και τα
κλειδιά του αρχικού πίνακα. Η συνάρτηση $transformer
έχει την
υπογραφή function ($value, $key, array $array): ?array{$newKey, $newValue}
. Αν το
$transformer
επιστρέψει null
, το στοιχείο παραλείπεται. Για τα
διατηρημένα στοιχεία, το πρώτο στοιχείο του επιστρεφόμενου πίνακα
χρησιμοποιείται ως νέο κλειδί και το δεύτερο στοιχείο ως νέα τιμή.
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$result = Arrays::mapWithKeys($array, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']
Αυτή η μέθοδος είναι χρήσιμη σε καταστάσεις όπου χρειάζεται να αλλάξετε τη δομή του πίνακα (κλειδιά και τιμές ταυτόχρονα) ή να φιλτράρετε στοιχεία κατά τον μετασχηματισμό (επιστρέφοντας null για ανεπιθύμητα στοιχεία).
mergeTree (array $array1, array $array2): array
Συγχωνεύει αναδρομικά δύο πίνακες. Είναι χρήσιμο, για παράδειγμα, για
τη συγχώνευση δενδρικών δομών. Κατά τη συγχώνευση, ακολουθεί τους
ίδιους κανόνες με τον τελεστή +
που εφαρμόζεται σε πίνακες,
δηλαδή, προσθέτει ζεύγη κλειδιού/τιμής από τον δεύτερο πίνακα στον
πρώτο πίνακα και σε περίπτωση σύγκρουσης κλειδιών, διατηρεί την τιμή
από τον πρώτο πίνακα.
$array1 = ['color' => ['favorite' => 'red'], 5];
$array2 = [10, 'color' => ['favorite' => 'green', 'blue']];
$array = Arrays::mergeTree($array1, $array2);
// $array = ['color' => ['favorite' => 'red', 'blue'], 5];
Οι τιμές από τον δεύτερο πίνακα προστίθενται πάντα στο τέλος του
πρώτου. Η εξαφάνιση της τιμής 10
από τον δεύτερο πίνακα μπορεί να
φαίνεται λίγο συγκεχυμένη. Πρέπει να συνειδητοποιήσετε ότι αυτή η
τιμή, καθώς και η τιμή 5
στον πρώτο πίνακα, έχουν αντιστοιχισμένο
το ίδιο αριθμητικό κλειδί 0
, επομένως, στον τελικό πίνακα
υπάρχει μόνο το στοιχείο από τον πρώτο πίνακα.
normalize (array $array, ?string $filling=null): array
Κανονικοποιεί τον πίνακα σε συσχετιστικό πίνακα. Αντικαθιστά τα
αριθμητικά κλειδιά με τις τιμές τους, η νέα τιμή θα είναι $filling
.
$array = Arrays::normalize([1 => 'first', 'a' => 'second']);
// $array = ['first' => null, 'a' => 'second'];
$array = Arrays::normalize([1 => 'first', 'a' => 'second'], 'foobar');
// $array = ['first' => 'foobar', 'a' => 'second'];
pick (array &$array, string|int $key, ?mixed $default=null): mixed
Επιστρέφει και αφαιρεί την τιμή του στοιχείου από τον πίνακα. Αν δεν
υπάρχει, ρίχνει μια εξαίρεση, ή επιστρέφει την τιμή $default
, αν έχει
καθοριστεί.
$array = [1 => 'foo', null => 'bar'];
$a = Arrays::pick($array, null);
// $a = 'bar'
$b = Arrays::pick($array, 'not-exists', 'foobar');
// $b = 'foobar'
$c = Arrays::pick($array, 'not-exists');
// throws Nette\InvalidArgumentException
renameKey (array &$array, string|int $oldKey, string|int $newKey): bool
Μετονομάζει το κλειδί στον πίνακα. Επιστρέφει true
αν το κλειδί
βρέθηκε στον πίνακα.
$array = ['first' => 10, 'second' => 20];
Arrays::renameKey($array, 'first', 'renamed');
// $array = ['renamed' => 10, 'second' => 20];
getKeyOffset (array $array, string|int $key): ?int
Επιστρέφει τη θέση του δεδομένου κλειδιού στον πίνακα. Η θέση
αριθμείται από το 0. Σε περίπτωση που το κλειδί δεν βρεθεί, η συνάρτηση
επιστρέφει null
.
$array = ['first' => 10, 'second' => 20];
$position = Arrays::getKeyOffset($array, 'first'); // vrátí 0 - επιστρέφει 0
$position = Arrays::getKeyOffset($array, 'second'); // vrátí 1 - επιστρέφει 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // vrátí null - επιστρέφει null
some (array $array, callable $predicate): bool
Ελέγχει αν τουλάχιστον ένα στοιχείο στον πίνακα περνάει τη δοκιμή
που υλοποιείται στο $predicate
με την υπογραφή
function ($value, $key, array $array): bool
.
$array = [1, 2, 3, 4];
$isEven = fn($value) => $value % 2 === 0;
$res = Arrays::some($array, $isEven); // true
Βλέπε every().
toKey (mixed $key): string|int
Μετατρέπει την τιμή σε κλειδί πίνακα, που είναι είτε ακέραιος είτε string.
Arrays::toKey('1'); // 1
Arrays::toKey('01'); // '01'
toObject (iterable $array, object $object): object
Αντιγράφει τα στοιχεία του πίνακα $array
στο αντικείμενο
$object
, το οποίο στη συνέχεια επιστρέφει.
$obj = new stdClass;
$array = ['foo' => 1, 'bar' => 2];
Arrays::toObject($array, $obj); // nastaví $obj->foo = 1; $obj->bar = 2; - ορίζει $obj->foo = 1; $obj->bar = 2;
wrap (array $array, string
$prefix=''
, string $suffix=''
): array
Μετατρέπει κάθε στοιχείο στον πίνακα σε string και το περιβάλλει με
πρόθεμα $prefix
και επίθεμα $suffix
.
$array = Arrays::wrap(['a' => 'red', 'b' => 'green'], '<<', '>>');
// $array = ['a' => '<<red>>', 'b' => '<<green>>'];
ArrayHash
Το αντικείμενο Nette\Utils\ArrayHash είναι απόγονος της γενικής κλάσης stdClass και το επεκτείνει με τη δυνατότητα να το χειρίζεται σαν πίνακα, δηλαδή, για παράδειγμα, να έχει πρόσβαση στα μέλη μέσω αγκυλών:
$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // zároveň funguje i objektový zápis - ταυτόχρονα, λειτουργεί και η αντικειμενοστρεφής γραφή
$hash->foo; // 123
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση count($hash)
για να βρείτε
τον αριθμό των στοιχείων.
Μπορείτε να επαναλάβετε πάνω στο αντικείμενο όπως και στην περίπτωση ενός πίνακα, και μάλιστα με αναφορά:
foreach ($hash as $key => $value) {
// ...
}
foreach ($hash as $key => &$value) {
$value = 'new value';
}
Μπορούμε να μετασχηματίσουμε έναν υπάρχοντα πίνακα σε ArrayHash
με τη μέθοδο from()
:
$array = ['foo' => 123, 'bar' => 456];
$hash = Nette\Utils\ArrayHash::from($array);
$hash->foo; // 123
$hash->bar; // 456
Η μετατροπή είναι αναδρομική:
$array = ['foo' => 123, 'inner' => ['a' => 'b']];
$hash = Nette\Utils\ArrayHash::from($array);
$hash->inner; // objekt ArrayHash - αντικείμενο ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'
Αυτό μπορεί να αποφευχθεί με τη δεύτερη παράμετρο:
$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // pole - πίνακας
Μετασχηματισμός πίσω σε πίνακα:
$array = (array) $hash;
ArrayList
Η Nette\Utils\ArrayList αντιπροσωπεύει έναν γραμμικό πίνακα, όπου οι δείκτες είναι μόνο ακέραιοι αριθμοί αύξοντες από το 0.
$list = new Nette\Utils\ArrayList;
$list[] = 'a';
$list[] = 'b';
$list[] = 'c';
// ArrayList(0 => 'a', 1 => 'b', 2 => 'c')
count($list); // 3
Μπορούμε να μετασχηματίσουμε έναν υπάρχοντα πίνακα σε ArrayList
με τη μέθοδο from()
:
$array = ['foo', 'bar'];
$list = Nette\Utils\ArrayList::from($array);
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση count($list)
για να βρείτε
τον αριθμό των στοιχείων.
Μπορείτε να επαναλάβετε πάνω στο αντικείμενο όπως και στην περίπτωση ενός πίνακα, και μάλιστα με αναφορά:
foreach ($list as $key => $value) {
// ...
}
foreach ($list as $key => &$value) {
$value = 'new value';
}
Η πρόσβαση σε κλειδιά εκτός των επιτρεπόμενων τιμών ρίχνει μια
εξαίρεση Nette\OutOfRangeException
:
echo $list[-1]; // vyhodí Nette\OutOfRangeException - ρίχνει Nette\OutOfRangeException
unset($list[30]); // vyhodí Nette\OutOfRangeException - ρίχνει Nette\OutOfRangeException
Η αφαίρεση ενός κλειδιού προκαλεί επαναρίθμηση των στοιχείων:
unset($list[1]);
// ArrayList(0 => 'a', 1 => 'c')
Ένα νέο στοιχείο μπορεί να προστεθεί στην αρχή με τη μέθοδο
prepend()
:
$list->prepend('d');
// ArrayList(0 => 'd', 1 => 'a', 2 => 'c')