Εργασία με πίνακες

Αυτή η σελίδα είναι αφιερωμένη στις κλάσεις 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')
έκδοση: 4.0