PHP массив в массиве: пример
PHP - современный язык программирования, популярный и широко применяемый. Как и в других, в нем есть синтаксис и семантика. Как полагается инструментальным средствам из сферы интернет-технологий: в PHP любая переменная может менять свой тип, как и когда того пожелает разработчик.
Во времена классической статики, особенно когда все переменные нужно было обязательно описывать заранее, программистам даже не приходило в голову использовать язык за пределами его синтаксиса.
Сегодня в PHP массив без явного указания типа его элементов (в том числе, массив или объект с неограниченным уровнем вложенности) - это реальность, следовательно: синтаксис и семантику языка можно трактовать по своему усмотрению.
Базовые понятия
Поскольку ничего описывать не надо, массив может появиться на пустом месте:
- $aMassa[] = 'первое значение - строка';
- $aMassa[] = 123; // второе значение - число.
Иначе говоря, чтобы на PHP добавить в массив, вовсе не обязательно предварять это действие описательной конструкцией:
- public $a_ins = array(); //
это массив, можно сразу писать:
- $this->a_ins[] = new scDocxS_tr($cLine, $oDocx)
и все будет абсолютно правильно.
Однако на PHP удалить элемент массива - аналогично удалению переменной.
- unset($aMasse['elementName']); // удалить массив по ключу;
- unset($aMassa[1]); // удалить второй элемент массива;
- unset($aMassa); // удалить весь массив.
Это несколько непривычно, похоже на удаление обычной переменной.
Обычные и ассоциативные массивы
Согласно синтаксису PHP: ключи массива - всегда последовательность целых чисел. Это утверждение верно всегда, но не всегда верно, что эта последовательность непрерывная.
Когда на PHP ассоциативный массив стал обычным привычным явлением, отношение к ключам не изменилось, просто элементы, которые получили обозначенный программистом ключ (все что угодно, кроме массива или объекта), стали иметь:
- обычный ключ по порядку;
- конкретный ключ для конкретного элемента массива.
Язык не ограничивает программиста в количестве элементов и размерностей, но в обоих случаях следует придерживаться обозримого и понимаемого количества. Мир очень многообразен, но строгать массивы более двух размерностей - занятие с очень сомнительной семантикой. Приличная ориентация в количестве элементов тысяча-другая, но никак не миллион или миллиард.
«Антимассивное» замечание
Безусловно, можно найти такие задачи, но чаще встречаются такие варианты решения, когда программа очень напоминает монстров на PL/1 или Fortran, заставлявших неметь (замирать) процессор больших советских вычислительных машин из серии ЕС ЭВМ/IBM.
Всегда можно обойтись скромными и простыми алгоритмами, даже когда нужно посчитать траекторию полета на Уран или Нептун. Лететь то долго, чего мудрить с монстрообразными алгоритмами вооруженными космическими массивами.
Крайности в программировании всегда опасны, память может закончиться в самый неожиданный момент, а логика работы PHP уже давно не контролирует не только работу с памятью, при внимательном рассмотрении можно обнаружить просчеты по всему спектру возможных ситуаций.
Массивы и строки
Мир - это всегда символы, то есть, в контексте языка программирования, - строки. Даже когда программа целиком посвящена математическим вычислениям, числа и цифры - все те же символы.
Превратить на PHP массив в строку - легко, как и обратно. Можно даже сказать, что это превращение стало своего рода конструкцией, еще не воплощенной в синтаксисе языка, но уже представленной в качестве опыта функциями explode() и implode().
Здесь вызов:
- $cSel = $oBase->iLineSel('d_name, d_work_folder, d_load', 'rm_documents', ...
создает строку:
- "ИмяФайла|РабочаяПапка|ФлагЗагрузки"
которая конструкцией:
- $aSel = explode('|', $cSel)
превращается в массив:
- $aSel[0] = "ИмяФайла";
- $aSel[1] = "РабочаяПапка";
- $aSel[2] = "ФлагЗагрузки";
Очень удобно и практично. Обратная функция implode() склеивает в одну строку все элементы массива, при этом не делая различий между строковыми значениями и числами. Со значениями других типов (объекты, внутренние массивы) будут трудности, но они решаемы.
PHP: массив в массиве
Практика применения массивов имеет три характерных момента. Обычный массив (элементы доступны по ключам языка), ассоциативный массив (элементы доступны по ключам программиста) и любые варианты ключей, но в качестве значений объекты, в простом случае - просто другие массивы.
Применять на PHP массив в массиве часто бывает нужно. По большому счету, массив (особенно когда он ассоциативный) можно рассматривать как вариант выхода за пределы синтаксиса языка: если просто переменная - это одно значение в каждый момент времени, то массив - это множество значений.
Ассоциативный массив - это масса переменных, имена и значения которых формируются в процессе работы программы, а потому могут быть использованы по задумке программиста, а не синтаксиса языка. Так ключ определяет использование значения. Важно понять: это не соответствие ключа значению, а именно «использование» значения. Например, в конструкции switch (массив[ключ]) {case 'x1' : func1(); case 'x2' : func2(); ...}.
Однако на PHP массив в массиве всегда будет жестко привязан к любому варианту использования, поскольку другие конструкции (операторы и выражения), по определению вовсе не «массивные». Иначе говоря, придав массиву собственный смысл, всегда его придется конкретизировать в ходе использования.
Ситуация резко меняется, когда в массиве находятся не массивы, а объекты.
Массивы объектов - динамика
Когда массив содержит в качестве элементов объекты - это очень практичный выход за рамки строгого использования (то есть «за пределы» синтаксиса).
Объект - более развитая структура данных, чем массив. Каждый объект может включать в себя некоторое количество массивов. В отличие от последних, объект имеет также методы, которые непосредственно связаны с ним и содержат в себе надлежащий функционал. Методы увязывают внутреннее содержание объекта с внешними событиями, функциями и другими объектами.
Объектам свойственно наследование, исполнение функционала, как сверху вниз так и обратно - все зависит от логики, реализуемой программистом. Но в любом случае, функции-методы объектов могут быть использованы вместо любой синтаксической конструкции [if () {} else {}; switch () {case '': ...break; case '': ...break; }; while () {}], они также могут работать в качестве операторов присваивания и формировать исполняемые выражения.
Благодаря наследованию и полиморфизму, которое реализовано достаточно полно, можно изменить синтаксис PHP "массив в массиве" на собственный вариант "массив через логику его объектов". Последнее означает крайне простую, но чрезвычайно эффективную идею. Создание массива объектов PHP: добавить в массив = добавить абстрактный элемент.
Абстрактные и реальные объекты
Абстракция в объектно-ориентированном программировании скорее дань традициям, которые изменили облик современного программирования. На самом деле начальный объект далеко не абстрактен и обязан достоверно описать все, что надлежит иметь его потомкам. Но коль скоро реализация ООП хромает не только в PHP, то одним абстрактным элементом обычно трудно обойтись.
Практически всегда нужно иметь абстрактный элемент и систему абстрактных элементов. Не всегда можно вести наследование системы объектов от объекта, равно как не все задачи допускают в качестве начального объекта систему объектов.
По большому счету возможно и то, и другое, вопрос в том, что в каждом конкретном случае следует руководствоваться здравым смыслом. ООП находится на стадии стремительного развития, имеет много белых пятен и свежих идей. Потому объединение экспромта, интуиции и здравого смысла - единственное разумное решение.
Пример «Правильные Документы»
Библиотека PhpOffice\PhpWord не стала категорически популярной, но дала возможность разрабатывать сайты, которые легко манипулируют документами MS Word: могут читать, обрабатывать и создавать их.
Нельзя сказать что библиотека легка в освоении, но область для ее эффективного использования имеется однозначно. Приведенные ниже скриншоты кода показывают, как можно описать комплект массивов и заполнить их.
Заполнение массивов на начальном этапе происходит так: массив $aSel - читается из таблиц базы данных, преобразуется на PHP массив в строку, действие происходит по каждому массиву функцией explode().
Описанное представляет собой трудоемкую, но вполне осязаемую форму применения массивов к серьезной практической задаче.
Описанные ранее идеи использования массивов и ООП нашли свое выражение при парсинге тела документа, который, как известно, построен по стандарту OOXML. Для решения данной задачи просто невозможно предусмотреть вариацию массивов в массивах на все варианты содержания документа, но предусмотреть один-единственный массив документа очень возможно.
Обозначить в этом массиве как элемент только параграф или таблицу - тоже доступно, ну а дальше дело техники: параграф разбивается на стили и тексты, а таблица - на ячейки в которых лежат параграфы.
Такое решение работает, доступно и осязаемо. Оно не требует держать в памяти многочисленные большие массивы и не заставляет при разработке планировать структуру массивов, как при чтении документа, так и при его создании.
Просто, практично, доступно.
Похожие статьи
- Практика использования функции PHP empty()
- Эффективное программирование на PHP: массивы в строку
- Обрезаем строку PHP: простые способы
- PHP-массив: функции и значение
- Извлечение координат из файла dxf autocad с помощью функции explode php
- Foreach PHP: последний элемент
- Checkbox html: примеры красивых кнопок на чистом CSS, создание "аккордеона", получение значений из форм с помощью PHP и jQuery