PHP: последний элемент. Массив в динамике

PHP - это перспективно и современно: качественный синтаксис и возможность делать семантику за пределами дозволенного. Реализация идей объектно-ориентированного программирования и свобода изменения типа переменной делает реальностью самые смелые фантазии.

Массивы - древняя конструкция, а ассоциативные - скорее дань времени, нежели требование практики. Хотя есть достаточное количество задач, которые предполагают создание совокупностей данных заранее не предусмотренного содержания (количество, значения, типы и индексы), которые доступны для просмотра и использования в циклах PHP foreach. Последний элемент массива доступен при любом способе создания. Array - обычные и ассоциативные - позволяют создавать списки, но в обычном синтаксисе PHP это имеет ограниченное применение.

Актуальное значение массива

Если абстрагироваться от индексов и использовать конструкцию

$arData[] = new scField(); // scNumber, scString, scParagraph, ...

где scField() - конструктор абстрактного объекта - "элемента информации", который имеет наследников: числа (scNumber), строки (scString), фразы (scParagraph), ... получим на PHP: последний элемент = массив объектов, проявляющий свои свойства как актуальный элемент.

По существу, неважно, какой элемент считать актуальным, но в этом случае придется следить за указателем (в PHP - курсор) внутри массива. Чаще - нужно иметь собственный указатель элемента. Необходимости в курсоре лишена идея PHP "последний элемент = массив". Доступный через функции end() и array_pop(), последний элемент как бы делегирует свои свойства массиву. Использование array_pop(), помимо этого, автоматически переводит массив на предыдущий элемент, и его свойства изменяются соответственно. Этим обуславливается возможность движения по элементам.

Таким образом, рассматривая в контексте синтаксис PHP, извлечь последний элемент массива фактически означает использовать его свойства. Последовательно, помещая и извлекая элементы, получаем динамику свойств, динамику новой структуры данных, сформированной в пределах доступного синтаксиса.

Первый и другие элементы

Имеются функции для работы с первым элементом массива и перемещения внутреннего указателя. В обычном синтаксисе, реализующем классическую практику программирования, они применимы. В отношении создания массивов с динамично изменяющимся смыслом - нет.

В программировании речь всегда идет о принятии решений: переменные принимают значения, операторы условий изменяют ход алгоритма, циклы что-то анализируют, в конечном итоге образуется результат.

Если перенести центр тяжести на собственно элемент и предоставить ему самому принимать решения, реализация программы приобретает совершенно другой, осмысленный вид. Чаще всего именно такой способ позволяет достичь цели, особенно когда речь идет, например, об использовании многочисленных тегов документа *.docx, записанных в стандарте Open XML.

На PHP получить последний элемент массива - это новый смысл и хорошие возможности.

Загрузка файлов и динамика свойств массивов

Когда сайт предоставляет возможность загрузки каких-либо файлов, удобно использовать идею абстрактного объекта, например, scFile и потомков от него scImage, scDocument, scTabe, которые будут иметь одноименные свойства, но различное их проявление и смысл (содержание). В контексте синтаксиса PHP (последний элемент = массив), используя функцию end(), можно использовать его так, как это определяет последний элемент. Это решение интересно тем, что оно инвертирует обычные представления и позволяет перемещаться по структуре данных так, как она была сформирована.

Такое применение массивов дает им совершенно новое содержание. Это предусмотрено синтаксисом PHP, но такое использование открывает широкие возможности.

Предусмотрев методы визуализации, сохранения в базе данных, восстановления в рабочем состоянии (например) можно будет не задумываться о том, что делать в конкретном случае. Все загруженные файлы помещаются в массив последовательно, а когда идет его обработка, вызываются всегда одни и те же методы по одной и той же схеме, но файл картинки будет отображен как есть, файл электронной таблицы - как таблица, а документ - как соответствующий текст. Доступный посредством синтаксиса PHP последний элемент, массив оснащает своими свойствами и конкретным содержанием.

В последнем случае документ всегда имеет символы, строки, числа и, что самое важное, форматирование. Уследить за каждым элементом сложно, но, предусмотрев для каждого элемента формата надлежащий объект, можно получить, не задумываясь, документ как есть.

Стек и рекурсия в пределах синтаксиса

Когда идет работа только с последним элементом, основное условие - это стек, но, когда этот элемент исполняется и в нем используется та же конструкция, а особенно он сам, - это рекурсия. Можно сказать много хорошего о библиотеках PHPOffice, например PHPWord, но утверждать, что они реализуют полноценный механизм, транслирующий исходное форматирование документа в результат, нельзя.

Действительно, используя PHPOffice\PHPWord можно элементарно открыть любой вордовский документ (*.docx), но это всего лишь архив множества структурированных xml-файлов, рисунков, объектов и др.

При этом, если взять только xml-файлы, хотя они взаимосвязаны (в части стилей, таблицы, рисунков), не получится сформировать новый документ на основе старого и просто перенести в него желаемые изменения (например, изменить шрифт, цвета, форматирование). Вариантов применения тегов Open XML множество, и даже столь отлаженный продукт, как MS Word, не всегда справляется с идеями пользователя, допуская ошибки.

Собственно *.docx файл - это zip-архив, причем четкой и понятной структуры. Используя небольшое количество объектов, можно формально описать его и получить в момент чтения полноценную, самостоятельную структуру данных, которой можно будет управлять семантически.

В данном случае информация в документе - формальная структура данных. Придав ей динамику, можно легко перейти на уровень смысла и абстрагироваться от синтаксиса.

Комментарии