Работа с полем
Эта страница посвящена классам 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
.
См. раздел Каждый().
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()
: