05-06-2018 13:40

Эффективные циклы foreach: PHP и правильные массивы

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

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

Постановка задач по SMART: примерыВам будет интересно:Постановка задач по SMART: примеры

Синтаксис цикла по содержанию

Формулируя синтаксис foreach, PHP предложил два варианта доступа к элементам. Оба не зависят ни от типа ключа, ни от типа значения и могут быть эмулированы обычным циклом. Предложено рассматривать массив как совокупность элементов, количество которых изначально не определено. Массив может формироваться на лету, как с ключами, так и без. В массиве может быть удален элемент, ключи могут быть ассоциативными и образованными по умолчанию.

foreach ($aArrayName as $xValue) { тело цикла }

Такая конструкция обязывает цикл foreach PHP пройтись по всем элементам подряд. В теле цикла переменная $xValue будет последовательно принимать все значения массива $aArrayName в том порядке, в котором они были добавлены. Значения ключей элементов доступны не будут.

foreach ($aArrayName as $xKey => $xValue) { тело цикла }

Здесь также, исполняя конструкцию foreach, PHP просмотрит все содержимое массива, но в теле цикла попарно будут принимать соответствующие значения как переменная $xValue, так и переменная $xKey - ключ элемента.

Последовательность элементов

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

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

Современные «правильные» элементы

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

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

Индекс стал ключом, а массив принял облик ассоциативного массива. То есть ключ потерял свою последовательную уникальность (обычно был последовательным: 0, 1, 2, ... n) и стал тоже значением, но простым значением (то есть ключом) связанным с реальным значением (то есть содержанием элемента). Это сегодня, это правильно, но не совершенно.

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

Правильные массивы правильных элементов

Сначала был элемент, потом два элемента... так появился массив элементов и цикл по массиву таковых:

for ($i=0; $i

тело обработки каждого $aArrayName[$i]

}

Потом у элемента вместо безликого 0, 1, 2, ... n появилось собственное имя - ключ и стали тогда массивы ассоциативным и понадобился тогда цикл foreach - «цикл по каждому»:

foreach ($aArrayName as $xKey => $xValue) {

тело обработки каждого $aArrayName[$xKey] или $xValue что одно и то же

}

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

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



Источник