PHP массив в массиве: пример

0
0

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 ключи массива

Когда на PHP ассоциативный массив стал обычным привычным явлением, отношение к ключам не изменилось, просто элементы, которые получили обозначенный программистом ключ (все что угодно, кроме массива или объекта), стали иметь:

  • обычный ключ по порядку;
  • конкретный ключ для конкретного элемента массива.

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

«Антимассивное» замечание

Безусловно, можно найти такие задачи, но чаще встречаются такие варианты решения, когда программа очень напоминает монстров на PL/1 или Fortran, заставлявших неметь (замирать) процессор больших советских вычислительных машин из серии ЕС ЭВМ/IBM.

PHP массив в строку

Всегда можно обойтись скромными и простыми алгоритмами, даже когда нужно посчитать траекторию полета на Уран или Нептун. Лететь то долго, чего мудрить с монстрообразными алгоритмами вооруженными космическими массивами.

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

Массивы и строки

Мир - это всегда символы, то есть, в контексте языка программирования, - строки. Даже когда программа целиком посвящена математическим вычислениям, числа и цифры - все те же символы.

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

пример использования explode()

Здесь вызов:

  • $cSel = $oBase->iLineSel('d_name, d_work_folder, d_load', 'rm_documents', ...

создает строку:

  • "ИмяФайла|РабочаяПапка|ФлагЗагрузки"

которая конструкцией:

  • $aSel = explode('|', $cSel)

превращается в массив:

  • $aSel[0] = "ИмяФайла";
  • $aSel[1] = "РабочаяПапка";
  • $aSel[2] = "ФлагЗагрузки";

Очень удобно и практично. Обратная функция implode() склеивает в одну строку все элементы массива, при этом не делая различий между строковыми значениями и числами. Со значениями других типов (объекты, внутренние массивы) будут трудности, но они решаемы.

PHP: массив в массиве

Практика применения массивов имеет три характерных момента. Обычный массив (элементы доступны по ключам языка), ассоциативный массив (элементы доступны по ключам программиста) и любые варианты ключей, но в качестве значений объекты, в простом случае - просто другие массивы.

PHP ассоциативный массив

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

Ассоциативный массив - это масса переменных, имена и значения которых формируются в процессе работы программы, а потому могут быть использованы по задумке программиста, а не синтаксиса языка. Так ключ определяет использование значения. Важно понять: это не соответствие ключа значению, а именно «использование» значения. Например, в конструкции switch (массив[ключ]) {case 'x1' : func1(); case 'x2' : func2(); ...}.

Однако на PHP массив в массиве всегда будет жестко привязан к любому варианту использования, поскольку другие конструкции (операторы и выражения), по определению вовсе не «массивные». Иначе говоря, придав массиву собственный смысл, всегда его придется конкретизировать в ходе использования.

Ситуация резко меняется, когда в массиве находятся не массивы, а объекты.

Массивы объектов - динамика

Когда массив содержит в качестве элементов объекты - это очень практичный выход за рамки строгого использования (то есть «за пределы» синтаксиса).

PHP удалить элемент массива

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

Объектам свойственно наследование, исполнение функционала, как сверху вниз так и обратно - все зависит от логики, реализуемой программистом. Но в любом случае, функции-методы объектов могут быть использованы вместо любой синтаксической конструкции [if () {} else {}; switch () {case '': ...break; case '': ...break; }; while () {}], они также могут работать в качестве операторов присваивания и формировать исполняемые выражения.

Благодаря наследованию и полиморфизму, которое реализовано достаточно полно, можно изменить синтаксис PHP "массив в массиве" на собственный вариант "массив через логику его объектов". Последнее означает крайне простую, но чрезвычайно эффективную идею. Создание массива объектов PHP: добавить в массив = добавить абстрактный элемент.

PHP добавить в массив

Абстрактные и реальные объекты

Абстракция в объектно-ориентированном программировании скорее дань традициям, которые изменили облик современного программирования. На самом деле начальный объект далеко не абстрактен и обязан достоверно описать все, что надлежит иметь его потомкам. Но коль скоро реализация ООП хромает не только в PHP, то одним абстрактным элементом обычно трудно обойтись.

Практически всегда нужно иметь абстрактный элемент и систему абстрактных элементов. Не всегда можно вести наследование системы объектов от объекта, равно как не все задачи допускают в качестве начального объекта систему объектов.

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

Пример «Правильные Документы»

Библиотека PhpOffice\PhpWord не стала категорически популярной, но дала возможность разрабатывать сайты, которые легко манипулируют документами MS Word: могут читать, обрабатывать и создавать их.

Нельзя сказать что библиотека легка в освоении, но область для ее эффективного использования имеется однозначно. Приведенные ниже скриншоты кода показывают, как можно описать комплект массивов и заполнить их.

Пример. Описание массивов

Заполнение массивов на начальном этапе происходит так: массив $aSel - читается из таблиц базы данных, преобразуется на PHP массив в строку, действие происходит по каждому массиву функцией explode().

Пример. Заполнение массивов

Описанное представляет собой трудоемкую, но вполне осязаемую форму применения массивов к серьезной практической задаче.

Описанные ранее идеи использования массивов и ООП нашли свое выражение при парсинге тела документа, который, как известно, построен по стандарту OOXML. Для решения данной задачи просто невозможно предусмотреть вариацию массивов в массивах на все варианты содержания документа, но предусмотреть один-единственный массив документа очень возможно.

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

Такое решение работает, доступно и осязаемо. Оно не требует держать в памяти многочисленные большие массивы и не заставляет при разработке планировать структуру массивов, как при чтении документа, так и при его создании.

Просто, практично, доступно.