Массивы Ключ/Значение

Массивы Ключ/Значение представляют собой последовательности определённым образом структурированных строк, которые при загрузке в систему трансформируются в пригодные для выполнения различных манипуляций массивы данных.
Если строка не начинается с символа /, то её первое слово интерпретируется как ключ, а все последующие как значение. Например, данная статья содержит секцию .s01 следующего содержания:
a1 некоторая последовательность слов
x1 100
x2 10 20 30 40

Указанная последовательность строк представляет собой массив из трёх элементов. Ключом первого элемента является последовательность символов a1, а значением строка "некоторая последовательность слов". Ключ второго элемента - x1, а значение - 100. Ключ третьего - x2, a значение - строка "10 20 30 40". При загрузке данная последовательность строк будет интерпретироваться как массив, индексом которого является ключ строки, а значением - все символы после ключа.
Array
(
    [a1] => некоторая последовательность слов
    [x1] => 100
    [x2] => 10 20 30 40
)
Если сразу после ключа указан символ : (двоеточие), то последующая часть строки интерпретируется как массив слов. В данной статье есть секция .s02 с такими данными:
b1: некоторая последовательность слов
y1 100
y2: 10 20 30 40

При загрузке она будет интерпретирована как массив, содержащий массивы и скаляры:
Array
(
    [b1] => Array
        (
            [0] => некоторая
            [1] => последовательность
            [2] => слов
        )

    [y1] => 100
    [y2] => Array
        (
            [0] => 10
            [1] => 20
            [2] => 30
            [3] => 40
        )

)
Ключи массива могут состоять из отдельных элементов, разделённых точкой. Это позволяет создавать достаточно сложные и универсальные структуры данных. В данной статье есть секция .s03 с такими данными:
q просто скаляр
a.b.1 10
a.b.2 слово
a.c: 50 60 70
a.d: 30 40 50
f.n название формулы
f.v sin(x)+log(x)

Такие данные могут быть преобразованы в многомерный массив следующей структуры:
Array
(
    [q] => просто скаляр
    [a] => Array
        (
            [b] => Array
                (
                    [1] => 10
                    [2] => слово
                )

            [c] => Array
                (
                    [0] => 50
                    [1] => 60
                    [2] => 70
                )

            [d] => Array
                (
                    [0] => 30
                    [1] => 40
                    [2] => 50
                )

        )

    [f] => Array
        (
            [n] => название формулы
            [v] => sin(x)+log(x)
        )

)
Данные могут быть многострочными. Для этого перед ключом должен быть указан символ /. В этом случае все последующие строки до строки состоящей только из символов // становятся значениями данного ключа. В данной статье есть секция .s04 с такими данными:
x 10
y слово
/z
Первая строка z
Вторая строка z
Третья строка z
//

При загрузке она станет массивом следующего содержания:
Array
(
    [x] => 10
    [y] => слово
    [z] => 
Первая строка z
Вторая строка z
Третья строка z

)
Если в конце ключа многострочной секции указан символ : (двоеточие), то каждая строка станет элементом вектора. В данной статье есть секция .s05 с такими данными:
x 10
y слово
/z:
Первая строка z
Вторая строка z
Третья строка z
//

При загрузке она станет массивом следующего содержания:
Array
(
    [x] => 10
    [y] => слово
    [z] => Array
        (
            [0] => Первая строка z
            [1] => Вторая строка z
            [2] => Третья строка z
        )

)
Данные в разделах, определяемых как массивы, сами могут быть представлены в форме ключ:значение. В данной статье есть секция .s06 с такими данными:
a: x:100 y:200 z:300 500 600
/b:
d:Строка d
e:Строка e
//

При загрузке она станет массивом следующего содержания:
Array
(
    [a] => Array
        (
            [x] => 100
            [y] => 200
            [z] => 300
            [0] => 500
            [1] => 600
        )

    [b] => Array
        (
            [d] => Строка d
            [e] => Строка e
        )

)

Функция mkz - создание массива ключ/значение из нескольких источников

Функция mkz(i[,p]) создаёт массив данных, объединяющий несколько источников. Список источников задаётся параметром i, который может быть массивом или строкой, включающей указатели на источники данных - неструктурированные (txt) файлы или секции структурированных файлов.
Если файл является структурированным (статья (s) или книга (k)), то строки запрошенной секции рассматриваются как источник данных для формирования элементов массива. Если файл является неструктурированным (txt), то указание на секцию, если оно задано, игнорируется и всё содержимое файла рассматривается как источник данных для формирования массива.
Данный пример объединяет секции s01 и s02 данной статьи в единый массив.
Разметка
~x=mkz('*~s01 *~s02')
@vms(x)
Вывод
Array
(
    [a1] => некоторая последовательность слов
    [x1] => 100
    [x2] => 10 20 30 40
    [b1] => Array
        (
            [0] => некоторая
            [1] => последовательность
            [2] => слов
        )

    [y1] => 100
    [y2] => Array
        (
            [0] => 10
            [1] => 20
            [2] => 30
            [3] => 40
        )

)
При создании массивов функцией mkz из данных структурированных файлов публикаций осуществляется контроль прав доступа владельца статьи на доступ к источникам данных. Если же данные размещены в неструктурированных файлах (txt), то никаких проверок не производится.
Все перечисленные источники последовательно слева направо и объединяются в один массив данных. Если объединяемые источники имеют одинаковые ключи, то значения одинаковых ключей при загрузке последовательно замещаются. Например, имеются два файла:
dok/t/mkz1.txt
a 100
b 200
c: 3 4 5
d Текст
dok/t/mkz2.txt
a 500
x 200
y: 30 40 50
d Другой текст
Как видно из их содержимого оба имеют одинаковые ключи: a и d. При их одновременной загрузке будет получен следующий результат:
Разметка
~x=mkz('dok/t/mkz1.txt dok/t/mkz2.txt')
@vms(x)
Вывод
Array
(
    [a] => 500
    [b] => 200
    [c] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 5
        )

    [d] => Другой текст
    [x] => 200
    [y] => Array
        (
            [0] => 30
            [1] => 40
            [2] => 50
        )

)
Видно, что в итоговом массиве остались значения ключей a и d из самого правого источника - файла dok/t/mkz2.txt.
Необязательный второй параметр функции mkz регулирует порядок обработки загружаемых данных. Он представляет собой строку, которая может включать разделённые пробелами параметры, представленные в формате ключ:значение. В настоящее время может использоваться только один параметр:
r - интерпретировать (1) или НЕ интерпретировать (0) структуру ключей (по умолчанию - 0).
Если задана интерпретация ключей, то учитываются все компоненты каждого ключа, отделённые от других символом . (точка). В этом случае элемент левее точки считается массивом, а элемент правее - индексом этого массива. В результате такой обработки всегда получается многомерный массив данных. Например, секция s03 данной статьи имеет данные следующего содержания:
q просто скаляр
a.b.1 10
a.b.2 слово
a.c: 50 60 70
a.d: 30 40 50
f.n название формулы
f.v sin(x)+log(x)
При её стандартной загрузке будет сформирован массив следующего содержания:
Array
(
    [q] => просто скаляр
    [a.b.1] => 10
    [a.b.2] => слово
    [a.c] => Array
        (
            [0] => 50
            [1] => 60
            [2] => 70
        )

    [a.d] => Array
        (
            [0] => 30
            [1] => 40
            [2] => 50
        )

    [f.n] => название формулы
    [f.v] => sin(x)+log(x)
)
Если же параметр r установлен в значение, не равное нулю, то полученный массив будет совсем иным:
Разметка
~m=mkz("*~s03","r:1")
@vms(m)
Вывод
Array
(
    [q] => просто скаляр
    [a] => Array
        (
            [b] => Array
                (
                    [1] => 10
                    [2] => слово
                )

            [c] => Array
                (
                    [0] => 50
                    [1] => 60
                    [2] => 70
                )

            [d] => Array
                (
                    [0] => 30
                    [1] => 40
                    [2] => 50
                )

        )

    [f] => Array
        (
            [n] => название формулы
            [v] => sin(x)+log(x)
        )

)

Пошаговое создание массива ключ/значение

Пошаговое создание массива ключ/значение предполагает использование нескольких последовательных функций, реализующих поэтапное создание и обработку. Это позволяет более гибко осуществлять загрузку данных в массив, совмещая её с обработкой выборок из последовательно накапливаемого массива. Для этого сначала функцией mkzso() создаётся новый объект. Далее, в него функциями mkzdd() и mkzdv() добавляется по одному источнику данных за один раз. Из созданного объекта функциями mkzpv(), mkzmm() и другими "вынимается" вектор или его часть и производится их обработка. Далее какие-то данные могут быть удалены из объекта, а какие-то новые включены повторными вызовами mkzdd() и mkzdv(). Опять может быть произведена выборка всей или части данных и их обработка. И так далее. Когда объект становится не нужен - его можно удалить функцией mkzuo().

Функция mkzso() - создание объекта массива ключ/значение

Функция mkzso() не имеет параметров. Она создаёт новый пустой массив ключ/значение и возвращает идентификатор этого объекта, который потом используется всеми последующими функциями для выполнения с ним требуемых манипуляций.

Функция mkzdd() - добавить данные

Функция mkzdd(im,ud) осуществляет загрузку в массив данных из одного источника. Здесь и везде далее параметр im обозначает идентификатор массива, полученный от функции mkzso(). Источник данных определяется параметром ud, который представляет собой указатель данных.
Функция mkzdd() загружает данные по правилам, ранее изложенным при рассмотрении функции mkz(). По сути дела, mkz() для каждого источника данных вызывает функцию mkzdd().
Функция mkzdd() не возвращает никаких значений.

Функция mkzdv() - добавить массив

Функция mkzdv(im,v) осуществляет загрузку в массив с идентификатором im данных из массива v. К данным массива добавляются все значения массива v. Новыми (обновляемыми) ключами данных являются индексы массива, а их значениями - значения элементов с этими индексами. Функция mkzdv() не возвращает никаких значений.

Функция mkzdz() - добавить значение

Функция mkzdz(im,k,z) осуществляет включение в массив с идентификатором im значение z с ключом k. Функция mkzdz() не возвращает никаких значений.

Функция mkzpz() - получить значение

Функция mkzpz(im,k) возвращает значение элемента с ключом k из массива с идентификатором im. Если значение с заданным ключом отсутствует, то возвращается значение NULL (nz()=1).

Функция mkzpo() - получить срез объекта

Функция mkzpo(im[,sk]) выполняет создание нового массива ключ/значение, выбирая в него значения массива с идентификатором im с заданными ключами, представленными списком sk. Если параметр sk не задан или пуст, то создаётся массив, полностью идентичный данному (копия), но с новым идентификатором. Список ключей может быть массивом или строкой, содержащий ключи, перечисленные через пробелы. Возвращает идентификатор нового массива.

Функция mkzpv() - получить срез массива

Функция mkzpv(im[,sk]) возвращает массив с указанными в sk ключами. Если параметр sk не задан или пуст, то в возвращаемый массив включаются все элементы. Список ключей может быть массивом или строкой, содержащей ключи, перечисленные через пробелы.

Функция mkzpk() - получить ключи

Функция mkzpk(im) возвращает массив всех ключей массива с идентификатором im.

Функция mkzuv() - удалить элементы

Функция mkzuv(im[,sk]) удаляет элементы с указанными в sk ключами из массива с идентификатором im. Если параметр sk не задан или пуст, то не удаляется ничего. Список ключей может быть массивом или строкой, содержащей ключи, перечисленные через пробелы.

Функция mkzvm() - вывести дамп массива

Функция mkzvm(im) выводит на страницу полное содержимое массива с идентификатором im.

Функция mkzkm() - получить выборку ключей массива

Функция mkzkm(im,m[,nk]) выбирает из массива с идентификатором im список ключей, соответствующих условиям, заданным маской m в соответствии с правилом, регламентированным параметром nk. Функция применяется к массивам, имеющим структурированные ключи с кодами, элементы которых разделены символом . (точка). Маска - это последовательность элементов, разделённых точкой. Если элемент содержит последовательность символов, не состоящую из символа * или не начинающуюся с символа ? (знак вопроса), то он определяет необходимость точного соответствия последовательности символов ключа в данной позиции кода, последовательности символов маски. Если в данной позиции маски находится символ *, то в аналогичной позиции ключа может находиться любая последовательность любых символов. Если код маски начинается с символа ? (знак вопроса), то соответствующий элемент ключа должен начинаться точно с тех же символов, которые указаны после знака вопроса. Необязательный параметр nk регулирует порядок сравнения маски с кодом ключа. Если он опущен или равен нулю, то сравнение выполняется только для тех позиций ключа, которые имеются в наличии. Если же nk не равно нулю, то ключ обязан иметь не меньше позиций, чем маска. В противном случае он в выборку не включается ни в каком случае. Функция возвращает отобранный список ключей в виде одномерного массива.

Функция mkzmm() - получить многомерный массив

Функция mkzmm(im) возвращает многомерный массив с учётом строения ключей. Любой ключ, элементы которого разделены точками интепретируется как структурный элемент массива. Первый элемент кода - имя массива, а все последующие - индексы соответствующего уровня. Например, элемент с ключом a.x.1 в результатном массиве станет элементом второго уровня в массиве a. В данном случае - элементом строки x столбца 1 матрицы a.

Функция mkzuo() - удалить объект массива

Функция mkzuo() удаляет объект массива со всеми его данными. Рекомендуется использовать только тогда, когда в одной статье последовательно создаётся и обрабатывается несколько массивов с большим объёмом данных.

Пример использования функций последовательной обработки массива ключ/значение


Разметка
Создаём массив ключ/значение и присваиваем его идентификатор переменной i
~i=mkzso()
Загружаем в массив данные из секций s03 и s06 данного файла
@mkzdd(i,"d:*~s03")
@mkzdd(i,"d:*~s06")
Выводим что получилось
@mkzvm(i)
Вывод
Создаём массив ключ/значение и присваиваем его идентификатор переменной i
Загружаем в массив данные из секций s03 и s06 данного файла
Выводим что получилось
Array
(
    [q] => просто скаляр
    [a.b.1] => 10
    [a.b.2] => слово
    [a.c] => Array
        (
            [0] => 50
            [1] => 60
            [2] => 70
        )

    [a.d] => Array
        (
            [0] => 30
            [1] => 40
            [2] => 50
        )

    [f.n] => название формулы
    [f.v] => sin(x)+log(x)
    [a] => Array
        (
            [x] => 100
            [y] => 200
            [z] => 300
            [0] => 500
            [1] => 600
        )

    [b] => Array
        (
            [d] => Строка d
            [e] => Строка e
        )

)

Разметка
Вынимаем массив с ключами q, f.n, f.v и b.
~x=mkzpv(i,"q f.n f.v b")
Смотрим, что выбрано
@vms(x)
Вывод
Вынимаем массив с ключами q, f.n, f.v и b.
Смотрим, что выбрано
Array
(
    [q] => просто скаляр
    [f.n] => название формулы
    [f.v] => sin(x)+log(x)
    [b] => Array
        (
            [d] => Строка d
            [e] => Строка e
        )

)
Разметка
Выбираем ключи по маске a.*.* (все ключи массива, первая часть составного кода которых равна a)
~k=mkzkm(i,"a.*.*")
@vms(k)
Теперь делаем то же самое, но в другом режиме
~k=mkzkm(i,"a.*.*",1)
@vms(k)
Вывод
Выбираем ключи по маске a.*.* (все ключи массива, первая часть составного кода которых равна a)
Array
(
    [0] => a.b.1
    [1] => a.b.2
    [2] => a.c
    [3] => a.d
    [4] => a
)
Теперь делаем то же самое, но в другом режиме
Array
(
    [0] => a.b.1
    [1] => a.b.2
)
В этом режиме если в маске три позиции, то не меньше трёх позиций должно быть и в коде отбираемых ключей.
Разметка
Получаем массив с преобразованием ключей в элементы массивов и смотрим, что получилось
~x=mkzmm(i)
@vms(x)
Вывод
Получаем массив с преобразованием ключей в элементы массивов и смотрим, что получилось
Array
(
    [q] => просто скаляр
    [a] => Array
        (
            [x] => 100
            [y] => 200
            [z] => 300
            [0] => 500
            [1] => 600
        )

    [f] => Array
        (
            [n] => название формулы
            [v] => sin(x)+log(x)
        )

    [b] => Array
        (
            [d] => Строка d
            [e] => Строка e
        )

)
Стоит обратить внимание, что первый массив a "затёрт" вторым, поскольку элементы с кодами a.b.1, a.b.2, a.c, a.d превратились в массив a с индексами, но потом при обработке кодов элементов выявился ещё один массив a, который и "затёр" то, что было сделано раньше.
Разметка
Удалим элемент с кодом a и повторим тот же вывод.
@mkzuv(i,'a')
~x=mkzmm(i)
@vms(x)
Вывод
Удалим элемент с ключом a и повторим тот же вывод.
Array
(
    [q] => просто скаляр
    [a] => Array
        (
            [b] => Array
                (
                    [1] => 10
                    [2] => слово
                )

            [c] => Array
                (
                    [0] => 50
                    [1] => 60
                    [2] => 70
                )

            [d] => Array
                (
                    [0] => 30
                    [1] => 40
                    [2] => 50
                )

        )

    [f] => Array
        (
            [n] => название формулы
            [v] => sin(x)+log(x)
        )

    [b] => Array
        (
            [d] => Строка d
            [e] => Строка e
        )

)
Теперь видно, что коды, начинающиеся с a, преобразованы в массивы.
Оцените публикацию по предложенной шкале
-5  -4  -3  -2  -1  0  +1  +2  +3  +4  +5

Статистика Код