Работа с полето
Тази страница е посветена на класовете Nette\Utils\Arrays, ArrayHash и ArrayList, които са свързани с масиви.
Монтаж:
Масиви
Nette\Utils\Arrays е статичен клас, който съдържа няколко удобни функции за масиви. Неговият еквивалент за итератори е Nette\Utils\Iterables.
Следващите примери предполагат, че псевдонимът вече е създаден:
associate(array $array, mixed $path): array|\stdClass
Функцията гъвкаво трансформира $array
в асоциативен масив или
обекти в съответствие със зададения път $path
. Пътят може да бъде
низ или масив. Той се състои от имената на ключовете във входния масив и
оператори като „[]“, „->“, „=“ и „|“. Изхвърля
Nette\InvalidArgumentException
, ако пътят е невалиден.
contains(array $array, $value): bool
Проверява масива за стойност. Използва стриктно сравнение
(===
).
every(array $array, callable $predicate): bool
Проверява дали всички елементи в масива са преминали теста,
реализиран в $predicate
с подпис function ($value, $key, array $array): bool
.
Вижте some().
filter(array $array, callable $predicate): array
Връща нов масив, съдържащ всички двойки ключ-стойност, отговарящи на
зададения $predicate
. Обратното извикване има сигнатурата
function ($value, int|string $key, array $array): bool
.
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.
Вижте last().
firstKey(array $array, ?callable $predicate=null): int|string|null
Връща ключа на първия елемент (отговарящ на зададения предикат, ако е
зададен) или null, ако няма такъв елемент. $predicate
има сигнатура
function ($value, int|string $key, array $array): bool
.
Вижте lastKey().
flatten(array $array, bool $preserveKeys=false): array
Консолидира масив от няколко нива в плосък масив.
get(array $array, string|int|array $key, ?mixed $default=null): mixed
Връща елемент $array[$key]
. Ако той не съществува, се изписва
изключение Nette\InvalidArgumentException
или, ако е зададен трети параметър
$default
, се връща този параметър.
Ключът $key
може да бъде и масив.
getRef(array &$array, string|int|array $key): mixed
Получава референция към посочения елемент на масива. Ако елементът не съществува, той ще бъде създаден със стойност null.
Подобно на функцията get(), тя може да обработва многомерни масиви.
grep(array $array, string $pattern, bool $invert=false): array
Връща само елементите на масива, чиято стойност отговаря на
регулярния израз $pattern
. Ако $invert
е равно на true
, се
връщат елементи, които не съвпадат. Грешка при компилиране или
изразяване хвърля изключение Nette\RegexpException
.
insertAfter(array &$array, string|int|null $key, array $inserted): void
Вмъква съдържанието на полето $inserted
в полето $array
веднага след елемента с ключ $key
. Ако $key
е null
(или не
е в полето), той се вмъква в края.
insertBefore(array &$array, string|int|null $key, array $inserted): void
Вмъква съдържанието на полето $inserted
в полето $array
преди
елемента с ключ $key
. Ако $key
е null
(или не е в полето),
той се вмъква в началото.
invoke(iterable $callbacks, …$args): array
Извиква всички обратни повиквания и връща масив от резултати.
invokeMethod(iterable $objects, string $method, …$args): array
Извиква метод за всеки обект в масива и връща масив от резултати.
isList(array $array): bool
Проверява се дали масивът е индексиран с нарастващ брой числови ключове, започвайки от нула, т.е. списък.
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.
Вижте first().
lastKey(array $array, ?callable $predicate=null): int|string|null
Връща ключа на последния елемент (отговарящ на зададения предикат,
ако е зададен) или null, ако няма такъв елемент. $predicate
има
сигнатура function ($value, int|string $key, array $array): bool
.
Вижте firstKey().
map(array $array, callable $transformer): array
Извиква $transformer
върху всички елементи на масив и връща масив от
върнати стойности. Обратното извикване има сигнатура
function ($value, $key, array $array): bool
.
mapWithKeys(array $array, callable $transformer): array
Създава нов масив, като трансформира стойностите и ключовете на
оригиналния масив. Функцията $transformer
има сигнатура
function ($value, $key, array $array): ?array{$newValue, $newKey}
. Ако $transformer
върне
null
, елементът се пропуска. За запазените елементи първият
елемент от върнатия масив се използва като нов ключ, а вторият
елемент – като нова стойност.
Този метод е полезен в ситуации, в които трябва да се промени структурата на масив (едновременно и ключове, и стойности) или да се филтрират елементите по време на преобразуването (чрез връщане на null за нежелани елементи).
mergeTree(array $array1, array $array2): array
Рекурсивно комбинира две полета. Това е полезно например за
обединяване на дървовидни структури. При сливането той следва същите
правила като оператора +
, прилаган за масиви, т.е. добавя
двойката ключ/стойност от втория масив към първия масив и оставя
стойността от първия масив в случай на сблъсък на ключове.
Стойностите от втория масив винаги се добавят към края на първия
масив. Изчезването на стойността 10
от второто поле може да
изглежда малко объркващо. Обърнете внимание, че тази стойност е същата
като стойността 5
v poli prvním mají přiřazený stejný numerický klíč 0
, така
че само елементът от първото поле влиза в получения масив.
normalize(array $array, ?string $filling=null): array
Нормализира масива до асоциативен масив. Заменя ключовете с числа с
техните стойности, като новата стойност е $filling
.
pick(array &$array, string|int $key, ?mixed $default=null): mixed
Връща и премахва стойността на елемент от масива. Ако не съществува,
се хвърля изключение или се връща стойността $default
, ако
съществува.
renameKey(array &$array, string|int $oldKey, string|int $newKey): bool
Преименуване на ключ в масив. Връща true
, ако ключът е намерен в
масива.
getKeyOffset(array $array, string|int $key): ?int
Връща позицията на посочения ключ в масива. Позицията се номерира от
0. Ако не е намерен ключ, функцията връща null
.
some(array $array, callable $predicate): bool
Проверява се дали поне един елемент от масива е преминал теста,
реализиран в $predicate
, с подпис function ($value, $key, array $array): bool
.
Вижте Every().
toKey(mixed $key): string|int
Конвертира стойността в ключ на масив, който е цяло число или низ.
toObject(iterable $array, object $object): object
Копира елементите на масива $array
в обект $object
, който след
това връща.
wrap(array $array, string
$prefix=''
, string $suffix=''
): array
Извежда всеки елемент от масива в низ и го обвива с префикс
$prefix
и суфикс $suffix
.
ArrayHash
Обектът Nette\Utils\ArrayHash е наследник на общия клас stdClass и го разширява с възможността да се третира като масив, т.е. да се отнася към членовете му например чрез квадратни скоби:
Можете да използвате функцията count($hash)
, за да получите броя на
членовете.
Можете да итерирате над обект, както при масив, дори при референция:
Можем да преобразуваме съществуващ масив в ArrayHash
, като
използваме метода from()
:
Преобразуването е рекурсивно:
Това може да се предотврати чрез използване на втори параметър:
Преобразуване обратно в масив:
ArrayList
Nette\Utils\ArrayList е линеен масив, в който като индекси се използват само цели числа, нарастващи от 0.
Съществуващите масиви могат да бъдат преобразувани в ArrayList
с
помощта на метода from()
:
Можете да използвате функцията count($list)
, за да получите броя на
елементите.
Можете да итерирате над обект, както в случая с масив, дори с референция:
Достъпът до ключове извън разрешените стойности води до изключение
Nette\OutOfRangeException
:
Премахването на клавиш ще доведе до промяна на номерацията на елементите:
Нов елемент може да бъде добавен в началото чрез метода
prepend()
: