Nette Documentation Preview

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

.[perex]
Αυτή η σελίδα είναι αφιερωμένη στις κλάσεις [Nette\Utils\Arrays |#Arrays], [#ArrayHash] και [#ArrayList], οι οποίες αφορούν πίνακες.


Εγκατάσταση:

```shell
composer require nette/utils
```


Arrays
======

Η [api:Nette\Utils\Arrays] είναι μια στατική κλάση που περιέχει χρήσιμες συναρτήσεις για εργασία με πίνακες. Το αντίστοιχό της για επαναλήπτες είναι η [Nette\Utils\Iterables|iterables].

Τα ακόλουθα παραδείγματα προϋποθέτουν τη δημιουργία ενός ψευδώνυμου:

```php
use Nette\Utils\Arrays;
```


associate(array $array, mixed $path): array|\stdClass .[method]
---------------------------------------------------------------

Η συνάρτηση μετασχηματίζει ευέλικτα τον πίνακα `$array` σε συσχετιστικούς πίνακες ή αντικείμενα σύμφωνα με την καθορισμένη διαδρομή `$path`. Η διαδρομή μπορεί να είναι string ή πίνακας. Αποτελείται από τα ονόματα των κλειδιών του πίνακα εισόδου και τελεστές όπως '[]', '->', '=', και '|'. Ρίχνει μια `Nette\InvalidArgumentException` σε περίπτωση που η διαδρομή είναι άκυρη.

```php
// μετατροπή σε συσχετιστικό πίνακα βάσει απλού κλειδιού
$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]]
```

```php
// αντιστοίχιση τιμών από ένα κλειδί σε άλλο με τη χρήση του τελεστή =
$result = Arrays::associate($arr, 'name=age'); // ή ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
```

```php
// δημιουργία αντικειμένου με τη χρήση του τελεστή ->
$result = Arrays::associate($arr, '->name'); // ή ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
```

```php
// συνδυασμός κλειδιών με τη χρήση του τελεστή |
$result = Arrays::associate($arr, 'name|age'); // ή ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
```

```php
// προσθήκη στον πίνακα με τη χρήση []
$result = Arrays::associate($arr, 'name[]'); // ή ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]
```


contains(array $array, $value): bool .[method]
----------------------------------------------

Ελέγχει τον πίνακα για την παρουσία μιας τιμής. Χρησιμοποιεί αυστηρή σύγκριση (`===`).

```php
Arrays::contains([1, 2, 3], 1);    // true
Arrays::contains(['1', false], 1); // false
```


every(array $array, callable $predicate): bool .[method]
--------------------------------------------------------

Ελέγχει αν όλα τα στοιχεία στον πίνακα περνούν τη δοκιμή που υλοποιείται στο `$predicate` με την υπογραφή `function ($value, $key, array $array): bool`.

```php
$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 .[method]{data-version:4.0.4}
------------------------------------------------------------------------------

Επιστρέφει έναν νέο πίνακα που περιέχει όλα τα ζεύγη κλειδιού-τιμής που αντιστοιχούν στο καθορισμένο κατηγόρημα. Το callback έχει την υπογραφή `function ($value, int|string $key, array $array): bool`.

```php
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 .[method]
-------------------------------------------------------------------------------------

Επιστρέφει το πρώτο στοιχείο (που αντιστοιχεί στο κατηγόρημα, αν έχει καθοριστεί). Αν δεν υπάρχει τέτοιο στοιχείο, επιστρέφει το αποτέλεσμα της κλήσης `$else` ή null. Η παράμετρος `$predicate` έχει την υπογραφή `function ($value, int|string $key, array $array): bool`.

Δεν αλλάζει τον εσωτερικό δείκτη σε αντίθεση με το `reset()`. Οι παράμετροι `$predicate` και `$else` υπάρχουν από την έκδοση 4.0.4.

```php
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 .[method]{data-version:4.0.4}
------------------------------------------------------------------------------------------------

Επιστρέφει το κλειδί του πρώτου στοιχείου (που αντιστοιχεί στο κατηγόρημα, αν αναφέρεται) ή null, αν δεν υπάρχει τέτοιο στοιχείο. Το κατηγόρημα `$predicate` έχει την υπογραφή `function ($value, int|string $key, array $array): bool`.

```php
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 .[method]
----------------------------------------------------------------

Ενοποιεί έναν πολυεπίπεδο πίνακα σε έναν επίπεδο.

```php
$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 .[method]
-------------------------------------------------------------------------------

Επιστρέφει το στοιχείο `$array[$key]`. Αν δεν υπάρχει, ρίχνει είτε μια εξαίρεση `Nette\InvalidArgumentException`, ή αν καθορίζεται η τρίτη παράμετρος `$default`, επιστρέφει αυτήν.

```php
// αν το $array['foo'] δεν υπάρχει, ρίχνει μια εξαίρεση
$value = Arrays::get($array, 'foo');

// αν το $array['foo'] δεν υπάρχει, επιστρέφει 'bar'
$value = Arrays::get($array, 'foo', 'bar');
```

Το κλειδί `$key` μπορεί επίσης να είναι πίνακας.

```php
$array = ['color' => ['favorite' => 'red'], 5];

$value = Arrays::get($array, ['color', 'favorite']);
// επιστρέφει 'red'
```


getRef(array &$array, string|int|array $key): mixed .[method]
-------------------------------------------------------------

Λαμβάνει μια αναφορά στο καθορισμένο στοιχείο του πίνακα. Αν το στοιχείο δεν υπάρχει, θα δημιουργηθεί με τιμή null.

```php
$valueRef = & Arrays::getRef($array, 'foo');
// επιστρέφει μια αναφορά στο $array['foo']
```

Όπως και η συνάρτηση [#get()], μπορεί να δουλέψει με πολυδιάστατους πίνακες.

```php
$value = & Arrays::getRef($array, ['color', 'favorite']);
// επιστρέφει μια αναφορά στο $array['color']['favorite']
```


grep(array $array, string $pattern, bool $invert=false): array .[method]
------------------------------------------------------------------------

Επιστρέφει μόνο αυτά τα στοιχεία του πίνακα των οποίων η τιμή ταιριάζει με την κανονική έκφραση `$pattern`. Αν το `$invert` είναι `true`, επιστρέφει αντίθετα τα στοιχεία που δεν ταιριάζουν. Σφάλμα κατά τη μεταγλώττιση ή την επεξεργασία της έκφρασης ρίχνει μια εξαίρεση `Nette\RegexpException`.

```php
$filteredArray = Arrays::grep($array, '~^\d+$~');
// επιστρέφει μόνο τα στοιχεία του πίνακα που αποτελούνται από ψηφία
```


insertAfter(array &$array, string|int|null $key, array $inserted): void .[method]
---------------------------------------------------------------------------------

Εισάγει το περιεχόμενο του πίνακα `$inserted` στον πίνακα `$array` αμέσως μετά το στοιχείο με το κλειδί `$key`. Αν το `$key` είναι `null` (ή δεν είναι στον πίνακα), εισάγεται στο τέλος.

```php
$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 .[method]
----------------------------------------------------------------------------------

Εισάγει το περιεχόμενο του πίνακα `$inserted` στον πίνακα `$array` πριν από το στοιχείο με το κλειδί `$key`. Αν το `$key` είναι `null` (ή δεν είναι στον πίνακα), εισάγεται στην αρχή.

```php
$array = ['first' => 10, 'second' => 20];
Arrays::insertBefore($array, 'first', ['hello' => 'world']);
// $array = ['hello' => 'world', 'first' => 10, 'second' => 20];
```


invoke(iterable $callbacks, ...$args): array .[method]
------------------------------------------------------

Καλεί όλα τα callbacks και επιστρέφει έναν πίνακα αποτελεσμάτων.

```php
$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 .[method]
--------------------------------------------------------------------------

Καλεί τη μέθοδο σε κάθε αντικείμενο στον πίνακα και επιστρέφει έναν πίνακα αποτελεσμάτων.

```php
$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 .[method]
------------------------------------

Επαληθεύει αν ο πίνακας είναι ευρετηριασμένος σύμφωνα με μια αύξουσα σειρά αριθμητικών κλειδιών από το μηδέν, γνωστός και ως λίστα.

```php
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 .[method]
------------------------------------------------------------------------------------

Επιστρέφει το τελευταίο στοιχείο (που αντιστοιχεί στο κατηγόρημα, αν έχει καθοριστεί). Αν δεν υπάρχει τέτοιο στοιχείο, επιστρέφει το αποτέλεσμα της κλήσης `$else` ή null. Η παράμετρος `$predicate` έχει την υπογραφή `function ($value, int|string $key, array $array): bool`.

Δεν αλλάζει τον εσωτερικό δείκτη σε αντίθεση με το `end()`. Οι παράμετροι `$predicate` και `$else` υπάρχουν από την έκδοση 4.0.4.

```php
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 .[method]{data-version:4.0.4}
-----------------------------------------------------------------------------------------------

Επιστρέφει το κλειδί του τελευταίου στοιχείου (που αντιστοιχεί στο κατηγόρημα, αν αναφέρεται) ή null, αν δεν υπάρχει τέτοιο στοιχείο. Το κατηγόρημα `$predicate` έχει την υπογραφή `function ($value, int|string $key, array $array): bool`.

```php
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 .[method]
---------------------------------------------------------

Καλεί το `$transformer` σε όλα τα στοιχεία του πίνακα και επιστρέφει έναν πίνακα επιστρεφόμενων τιμών. Το callback έχει την υπογραφή `function ($value, $key, array $array): mixed`.

```php
$array = ['foo', 'bar', 'baz'];
$res = Arrays::map($array, fn($value) => $value . $value);
// $res = ['foofoo', 'barbar', 'bazbaz']
```


mapWithKeys(array $array, callable $transformer): array .[method]
-----------------------------------------------------------------

Δημιουργεί έναν νέο πίνακα μετασχηματίζοντας τις τιμές και τα κλειδιά του αρχικού πίνακα. Η συνάρτηση `$transformer` έχει την υπογραφή `function ($value, $key, array $array): ?array{$newKey, $newValue}`. Αν το `$transformer` επιστρέψει `null`, το στοιχείο παραλείπεται. Για τα διατηρημένα στοιχεία, το πρώτο στοιχείο του επιστρεφόμενου πίνακα χρησιμοποιείται ως νέο κλειδί και το δεύτερο στοιχείο ως νέα τιμή.

```php
$array = ['a' => 1, 'b' => 2];
$result = Arrays::mapWithKeys($array, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
// [4 => 'B']
```

Αυτή η μέθοδος είναι χρήσιμη σε καταστάσεις όπου χρειάζεται να αλλάξετε τη δομή του πίνακα (κλειδιά και τιμές ταυτόχρονα) ή να φιλτράρετε στοιχεία κατά τον μετασχηματισμό (επιστρέφοντας null για ανεπιθύμητα στοιχεία).


mergeTree(array $array1, array $array2): array .[method]
--------------------------------------------------------

Συγχωνεύει αναδρομικά δύο πίνακες. Είναι χρήσιμο, για παράδειγμα, για τη συγχώνευση δενδρικών δομών. Κατά τη συγχώνευση, ακολουθεί τους ίδιους κανόνες με τον τελεστή `+` που εφαρμόζεται σε πίνακες, δηλαδή, προσθέτει ζεύγη κλειδιού/τιμής από τον δεύτερο πίνακα στον πρώτο πίνακα και σε περίπτωση σύγκρουσης κλειδιών, διατηρεί την τιμή από τον πρώτο πίνακα.

```php
$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 .[method]
---------------------------------------------------------------

Κανονικοποιεί τον πίνακα σε συσχετιστικό πίνακα. Αντικαθιστά τα αριθμητικά κλειδιά με τις τιμές τους, η νέα τιμή θα είναι `$filling`.

```php
$array = Arrays::normalize([1 => 'first', 'a' => 'second']);
// $array = ['first' => null, 'a' => 'second'];
```

```php
$array = Arrays::normalize([1 => 'first', 'a' => 'second'], 'foobar');
// $array = ['first' => 'foobar', 'a' => 'second'];
```


pick(array &$array, string|int $key, ?mixed $default=null): mixed .[method]
---------------------------------------------------------------------------

Επιστρέφει και αφαιρεί την τιμή του στοιχείου από τον πίνακα. Αν δεν υπάρχει, ρίχνει μια εξαίρεση, ή επιστρέφει την τιμή `$default`, αν έχει καθοριστεί.

```php
$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 .[method]
--------------------------------------------------------------------------------

Μετονομάζει το κλειδί στον πίνακα. Επιστρέφει `true` αν το κλειδί βρέθηκε στον πίνακα.

```php
$array = ['first' => 10, 'second' => 20];
Arrays::renameKey($array, 'first', 'renamed');
// $array = ['renamed' => 10, 'second' => 20];
```


getKeyOffset(array $array, string|int $key): ?int .[method]
-----------------------------------------------------------

Επιστρέφει τη θέση του δεδομένου κλειδιού στον πίνακα. Η θέση αριθμείται από το 0. Σε περίπτωση που το κλειδί δεν βρεθεί, η συνάρτηση επιστρέφει `null`.

```php
$array = ['first' => 10, 'second' => 20];
$position = Arrays::getKeyOffset($array, 'first'); // επιστρέφει 0
$position = Arrays::getKeyOffset($array, 'second'); // επιστρέφει 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // επιστρέφει null
```


some(array $array, callable $predicate): bool .[method]
-------------------------------------------------------

Ελέγχει αν τουλάχιστον ένα στοιχείο στον πίνακα περνάει τη δοκιμή που υλοποιείται στο `$predicate` με την υπογραφή `function ($value, $key, array $array): bool`.

```php
$array = [1, 2, 3, 4];
$isEven = fn($value) => $value % 2 === 0;
$res = Arrays::some($array, $isEven); // true
```

Βλέπε [#every()].


toKey(mixed $key): string|int .[method]
---------------------------------------

Μετατρέπει την τιμή σε κλειδί πίνακα, που είναι είτε ακέραιος είτε string.

```php
Arrays::toKey('1');  // 1
Arrays::toKey('01'); // '01'
```


toObject(iterable $array, object $object): object .[method]
-----------------------------------------------------------

Αντιγράφει τα στοιχεία του πίνακα `$array` στο αντικείμενο `$object`, το οποίο στη συνέχεια επιστρέφει.

```php
$obj = new stdClass;
$array = ['foo' => 1, 'bar' => 2];
Arrays::toObject($array, $obj); // ορίζει $obj->foo = 1; $obj->bar = 2;
```


wrap(array $array, string $prefix='', string $suffix=''): array .[method]
-------------------------------------------------------------------------

Μετατρέπει κάθε στοιχείο στον πίνακα σε string και το περιβάλλει με πρόθεμα `$prefix` και επίθεμα `$suffix`.

```php
$array = Arrays::wrap(['a' => 'red', 'b' => 'green'], '<<', '>>');
// $array = ['a' => '<<red>>', 'b' => '<<green>>'];
```


ArrayHash
=========

Το αντικείμενο [api:Nette\Utils\ArrayHash] είναι απόγονος της γενικής κλάσης stdClass και το επεκτείνει με τη δυνατότητα να το χειρίζεται σαν πίνακα, δηλαδή, για παράδειγμα, να έχει πρόσβαση στα μέλη μέσω αγκυλών:

```php
$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // ταυτόχρονα, λειτουργεί και η αντικειμενοστρεφής γραφή
$hash->foo; // 123
```

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση `count($hash)` για να βρείτε τον αριθμό των στοιχείων.

Μπορείτε να επαναλάβετε πάνω στο αντικείμενο όπως και στην περίπτωση ενός πίνακα, και μάλιστα με αναφορά:

```php
foreach ($hash as $key => $value) {
	// ...
}

foreach ($hash as $key => &$value) {
	$value = 'new value';
}
```

Μπορούμε να μετασχηματίσουμε έναν υπάρχοντα πίνακα σε `ArrayHash` με τη μέθοδο `from()`:

```php
$array = ['foo' => 123, 'bar' => 456];

$hash = Nette\Utils\ArrayHash::from($array);
$hash->foo; // 123
$hash->bar; // 456
```

Η μετατροπή είναι αναδρομική:

```php
$array = ['foo' => 123, 'inner' => ['a' => 'b']];

$hash = Nette\Utils\ArrayHash::from($array);
$hash->inner; // αντικείμενο ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'
```

Αυτό μπορεί να αποφευχθεί με τη δεύτερη παράμετρο:

```php
$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // πίνακας
```

Μετασχηματισμός πίσω σε πίνακα:

```php
$array = (array) $hash;
```


ArrayList
=========

Η [api:Nette\Utils\ArrayList] αντιπροσωπεύει έναν γραμμικό πίνακα, όπου οι δείκτες είναι μόνο ακέραιοι αριθμοί αύξοντες από το 0.

```php
$list = new Nette\Utils\ArrayList;
$list[] = 'a';
$list[] = 'b';
$list[] = 'c';
// ArrayList(0 => 'a', 1 => 'b', 2 => 'c')
count($list); // 3
```

Μπορούμε να μετασχηματίσουμε έναν υπάρχοντα πίνακα σε `ArrayList` με τη μέθοδο `from()`:

```php
$array = ['foo', 'bar'];
$list = Nette\Utils\ArrayList::from($array);
```

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση `count($list)` για να βρείτε τον αριθμό των στοιχείων.

Μπορείτε να επαναλάβετε πάνω στο αντικείμενο όπως και στην περίπτωση ενός πίνακα, και μάλιστα με αναφορά:

```php
foreach ($list as $key => $value) {
	// ...
}

foreach ($list as $key => &$value) {
	$value = 'new value';
}
```

Η πρόσβαση σε κλειδιά εκτός των επιτρεπόμενων τιμών ρίχνει μια εξαίρεση `Nette\OutOfRangeException`:

```php
echo $list[-1]; // ρίχνει Nette\OutOfRangeException
unset($list[30]); // ρίχνει Nette\OutOfRangeException
```

Η αφαίρεση ενός κλειδιού προκαλεί επαναρίθμηση των στοιχείων:

```php
unset($list[1]);
// ArrayList(0 => 'a', 1 => 'c')
```

Ένα νέο στοιχείο μπορεί να προστεθεί στην αρχή με τη μέθοδο `prepend()`:

```php
$list->prepend('d');
// ArrayList(0 => 'd', 1 => 'a', 2 => 'c')
```

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

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

// μετατροπή σε συσχετιστικό πίνακα βάσει απλού κλειδιού
$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]]
// αντιστοίχιση τιμών από ένα κλειδί σε άλλο με τη χρήση του τελεστή =
$result = Arrays::associate($arr, 'name=age'); // ή ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// δημιουργία αντικειμένου με τη χρήση του τελεστή ->
$result = Arrays::associate($arr, '->name'); // ή ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// συνδυασμός κλειδιών με τη χρήση του τελεστή |
$result = Arrays::associate($arr, 'name|age'); // ή ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// προσθήκη στον πίνακα με τη χρήση []
$result = Arrays::associate($arr, '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, επιστρέφει αυτήν.

// αν το $array['foo'] δεν υπάρχει, ρίχνει μια εξαίρεση
$value = Arrays::get($array, 'foo');

// αν το $array['foo'] δεν υπάρχει, επιστρέφει 'bar'
$value = Arrays::get($array, 'foo', 'bar');

Το κλειδί $key μπορεί επίσης να είναι πίνακας.

$array = ['color' => ['favorite' => 'red'], 5];

$value = Arrays::get($array, ['color', 'favorite']);
// επιστρέφει 'red'

getRef(array &$array, string|int|array $key)mixed

Λαμβάνει μια αναφορά στο καθορισμένο στοιχείο του πίνακα. Αν το στοιχείο δεν υπάρχει, θα δημιουργηθεί με τιμή null.

$valueRef = & Arrays::getRef($array, 'foo');
// επιστρέφει μια αναφορά στο $array['foo']

Όπως και η συνάρτηση get(), μπορεί να δουλέψει με πολυδιάστατους πίνακες.

$value = & Arrays::getRef($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+$~');
// επιστρέφει μόνο τα στοιχεία του πίνακα που αποτελούνται από ψηφία

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): mixed.

$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];
$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'); // επιστρέφει 0
$position = Arrays::getKeyOffset($array, 'second'); // επιστρέφει 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // επιστρέφει 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); // ορίζει $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; // ταυτόχρονα, λειτουργεί και η αντικειμενοστρεφής γραφή
$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; // αντικείμενο ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'

Αυτό μπορεί να αποφευχθεί με τη δεύτερη παράμετρο:

$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // πίνακας

Μετασχηματισμός πίσω σε πίνακα:

$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]; // ρίχνει Nette\OutOfRangeException
unset($list[30]); // ρίχνει Nette\OutOfRangeException

Η αφαίρεση ενός κλειδιού προκαλεί επαναρίθμηση των στοιχείων:

unset($list[1]);
// ArrayList(0 => 'a', 1 => 'c')

Ένα νέο στοιχείο μπορεί να προστεθεί στην αρχή με τη μέθοδο prepend():

$list->prepend('d');
// ArrayList(0 => 'd', 1 => 'a', 2 => 'c')