Funcții de matrice

Această pagină se referă la clasele Nette\Utils\Arrays, ArrayHash și ArrayList, care sunt legate de array-uri.

Instalare:

composer require nette/utils

Array-uri

Nette\Utils\Arrays este o clasă statică, care conține o serie de funcții practice de matrice. Echivalentul său pentru iteratori este Nette\Utils\Iterables.

Exemplele următoare presupun că este definit următorul alias de clasă:

use Nette\Utils\Arrays;

associate (array $array, mixed $path): array|\stdClass

Funcția transformă în mod flexibil $array într-o matrice asociativă sau obiecte în funcție de calea specificată $path. Calea poate fi un șir de caractere sau o matrice. Aceasta constă din numele cheilor din tabloul de intrare și operatori precum “[]”, “->”, “=” și “|”. Se aruncă Nette\InvalidArgumentException în cazul în care calea nu este validă.

// conversia într-un tablou asociativ utilizând o cheie simplă
$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]]
// atribuirea de valori de la o cheie la alta cu ajutorul operatorului =.
$result = Arrays::associate($arr, 'name=age'); // sau ['name', '=', 'age']
// $result = ['John' => 11, 'Mary' => null, ...]
// crearea unui obiect cu ajutorul operatorului ->
$result = Arrays::associate($arr, '->name'); // sau ['->', 'name']
// $result = (object) ['John' => ['name' => 'John', 'age' => 11], 'Mary' => ['name' => 'Mary', 'age' => null]]
// combinarea cheilor cu ajutorul operatorului |
$result = Arrays::associate($arr, 'name|age'); // sau ['name', '|', 'age']
// $result: ['John' => ['name' => 'John', 'age' => 11], 'Paul' => ['name' => 'Paul', 'age' => 44]]
// adăugarea la un array folosind []
$result = Arrays::associate($arr, 'name[]'); // sau ['name', '[]']
// $result: ['John' => [['name' => 'John', 'age' => 22], ['name' => 'John', 'age' => 11]]]

contains (array $array, $value)bool

Testează un tablou pentru prezența unei valori. Utilizează o comparație strictă (===)

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

every (array $array, callable $predicate)bool

Testează dacă toate elementele din matrice trec testul implementat de funcția furnizată, care are semnătura function ($value, $key, array $array): bool.

$array = [1, 30, 39, 29, 10, 13];
$isBelowThreshold = fn($value) => $value < 40;
$res = Arrays::every($array, $isBelowThreshold); // true

A se vedea some().

filter (array $array, callable $predicate)array

Returnează o nouă matrice care conține toate perechile cheie-valoare care corespund cu $predicate. Callback-ul are semnătura 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

Returnează primul element (care corespunde predicatului specificat, dacă este dat). Dacă nu există un astfel de element, se returnează rezultatul invocării $else sau null.
$predicate are semnătura function ($value, int|string $key, array $array): bool.

Nu modifică pointerul intern, spre deosebire de reset(). Parametrii $predicate și $else există începând cu versiunea 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

A se vedea last().

firstKey (array $array, ?callable $predicate=null): int|string|null

Returnează cheia primului element (care corespunde predicatului specificat, dacă este dat) sau nulă dacă nu există un astfel de element. $predicate are semnătura 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

A se vedea lastKey().

flatten (array $array, bool $preserveKeys=false)array

Transformă matricea multidimensională în matrice plată.

$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

Returnează $array[$key] item. Dacă nu există, se aruncă Nette\InvalidArgumentException, cu excepția cazului în care se stabilește o valoare implicită ca al treilea argument.

// dacă $array['foo'] nu există, se aruncă o excepție
$value = Arrays::get($array, 'foo');

// dacă $array['foo'] nu există, se returnează 'bar'.
$value = Arrays::get($array, 'foo', 'bar');

Argumentul $key poate fi la fel de bine o matrice.

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

$value = Arrays::get($array, ['color', 'favorite']);
// returns 'red'

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

Obține o referință la $array[$key]. Dacă indexul nu există, se creează unul nou cu valoarea null.

$valueRef = & Arrays::getRef($array, 'foo');
// returnează referința $array['foo']

Funcționează cu array-uri multidimensionale, precum și cu get().

$value = & Arrays::get($array, ['color', 'favorite']);
// returnează referința $array['color']['favorite']].

grep (array $array, string $pattern, bool $invert=false)array

Returnează numai acele elemente din matrice care corespund unei expresii regulate $pattern. Dacă $invert este true, returnează elementele care nu se potrivesc. O eroare de compilare sau de execuție a expresiei regizorale aruncă Nette\RegexpException.

$filteredArray = Arrays::grep($array, '~^\d+$~');
// returnează numai elemente numerice

insertAfter (array &$array, string|int|null $key, array $inserted)void

Introduce conținutul matricei $inserted în $array imediat după $key. Dacă $key este null (sau nu există), se introduce la sfârșit.

$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

Introduce conținutul tabloului $inserted în $array înainte de $key. Dacă $key este null (sau nu există), se introduce la început.

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

invoke (iterable $callbacks, …$args)array

Invocă toate callback-urile și returnează matricea de rezultate.

$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

Invocă metoda pe fiecare obiect dintr-un tablou și returnează un tablou de rezultate.

$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

Verifică dacă matricea este indexată în ordinea crescătoare a cheilor numerice de la zero, adică o listă.

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

Returnează ultimul element (care corespunde predicatului specificat, dacă este dat). Dacă nu există un astfel de element, se returnează rezultatul invocării $else sau null.
$predicate are semnătura function ($value, int|string $key, array $array): bool.

Nu modifică pointerul intern, spre deosebire de end(). Parametrii $predicate și $else există începând cu versiunea 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

A se vedea first().

lastKey (array $array, ?callable $predicate=null): int|string|null

Returnează cheia ultimului element (care corespunde predicatului specificat, dacă este dat) sau nulă dacă nu există un astfel de element. $predicate are semnătura 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

A se vedea firstKey().

map (array $array, callable $transformer)array

Solicită $transformer pentru toate elementele din matrice și returnează matricea de valori de returnare. Callback-ul are semnătura 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

Creează un nou array prin transformarea valorilor și a cheilor array-ului original. Funcția $transformer are semnătura function ($value, $key, array $array): ?array{$newValue, $newKey}. Dacă $transformer returnează null, elementul este ignorat. Pentru elementele păstrate, primul element al matricei returnate este utilizat ca nouă cheie, iar al doilea element ca nouă valoare.

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

Această metodă este utilă în situațiile în care trebuie să modificați structura unui array (atât cheile, cât și valorile simultan) sau să filtrați elementele în timpul transformării (returnând null pentru elementele nedorite).

mergeTree (array $array1, array $array2)array

Fuzionează recurent două câmpuri. Este util, de exemplu, pentru fuzionarea structurilor arborescente. Se comportă ca operatorul + pentru array, adică adaugă o pereche cheie/valoare din al doilea array la primul array și păstrează valoarea din primul array în cazul unei coliziuni de chei.

$array1 = ['color' => ['favorite' => 'red'], 5];
$array2 = [10, 'color' => ['favorite' => 'green', 'blue']];

$array = Arrays::mergeTree($array1, $array2);
// $array = ['color' => ['favorite' => 'red', 'blue'], 5];

Valorile din al doilea tablou sunt întotdeauna adăugate la primul. Dispariția valorii 10 din cel de-al doilea tablou poate părea puțin confuză. Trebuie remarcat faptul că această valoare, precum și valoarea 5 in the first array have the same numeric key 0, astfel încât în câmpul rezultat există doar un element din prima matrice.

normalize (array $array, ?string $filling=null)array

Normalizează matricea în matrice asociativă. Înlocuiește cheile numerice cu valorile lor, noua valoare va fi $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

Returnează și elimină valoarea unui element dintr-un tablou. Dacă acesta nu există, se aruncă o excepție sau se returnează $default, dacă este furnizat.

$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');
// aruncă Nette\InvalidArgumentException

renameKey (array &$array, string|int $oldKey, string|int $newKey)bool

Redenumește o cheie. Returnează true dacă cheia a fost găsită în matrice.

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

getKeyOffset (array $array, string|int $key)?int

Returnează poziția indexată cu zero a cheii date în matrice. În cazul în care cheia nu este găsită, se returnează null.

$array = ['first' => 10, 'second' => 20];
$position = Arrays::getKeyOffset($array, 'first'); // returnează 0
$position = Arrays::getKeyOffset($array, 'second'); // returnează 1
$position = Arrays::getKeyOffset($array, 'not-exists'); // returnează null

some (array $array, callable $predicate)bool

Testează dacă cel puțin un element din matrice trece testul implementat de callback-ul furnizat cu semnătura function ($value, $key, array $array): bool.

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

A se vedea every().

toKey (mixed $key): string|int

Convertește o valoare într-o cheie de matrice, care este fie un număr întreg, fie un șir de caractere.

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

toObject (iterable $array, object $object)object

Copiază elementele din tabloul $array în obiectul $object și apoi îl returnează.

$obj = new stdClass;
$array = ['foo' => 1, 'bar' => 2];
Arrays::toObject($array, $obj); // setează $obj->foo = 1; $obj->bar = 2;

wrap (array $array, string $prefix='', string $suffix='')array

Transformă fiecare element al tabloului în șir de caractere și îl închide cu $prefix și $suffix.

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

ArrayHash

Obiectul Nette\Utils\ArrayHash este descendentul clasei generice stdClass și o extinde cu posibilitatea de a o trata ca pe o matrice, de exemplu, accesând membrii folosind paranteze pătrate:

$hash = new Nette\Utils\ArrayHash;
$hash['foo'] = 123;
$hash->bar = 456; // de asemenea, funcționează notația obiect
$hash->foo; // 123

Puteți utiliza funcția count($hash) pentru a obține numărul de elemente.

Puteți itera peste un obiect la fel ca peste o matrice, chiar și cu o referință:

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

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

Array-urile existente pot fi transformate în ArrayHash folosind from():

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

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

Transformarea este recursivă:

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

$hash = Nette\Utils\ArrayHash::from($array);
$hash->inner; // obiect ArrayHash
$hash->inner->a; // 'b'
$hash['inner']['a']; // 'b'

Ea poate fi evitată cu ajutorul celui de-al doilea parametru:

$hash = Nette\Utils\ArrayHash::from($array, false);
$hash->inner; // array

Transformă înapoi în matrice:

$array = (array) $hash;

ArrayList

Nette\Utils\ArrayList reprezintă o matrice liniară în care indicii sunt numai numere întregi care cresc de la 0.

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

Puteți utiliza funcția count($list) pentru a obține numărul de elemente.

Puteți itera peste un obiect la fel ca peste o matrice, chiar și cu o referință:

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

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

Rețelele existente pot fi transformate în ArrayList utilizând from():

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

Accesarea cheilor dincolo de valorile permise aruncă o excepție Nette\OutOfRangeException:

echo $list[-1]; // aruncă Nette\OutOutOfRangeException
unset($list[30]); // aruncă Nette\OutOfRangeException

Eliminarea cheii va duce la renumerotarea elementelor:

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

Puteți adăuga un nou element la început folosind prepend():

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