Циклы
Тег <for> предназначен для многократного выполнения блоков LXP. При вызове он всегда получает обязательный атрибут start, а также один из атрибутов end и endbefore. Всем атрибутам должны быть присвоены числовые значения.
Атрибут start инициализирует целочисленный счетчик цикла, который увеличивается на 1 при каждой последующей итерации. Если в теге определен атрибут end, цикл прекращается после достижения числа, указанного в этом атрибуте. Если же определен атрибут endbefore, цикл прекращается на одну итерацию раньше. Таким образом, атрибуты end и endbefore в этом отношении функционально эквивалентны операторам <= и < таких языков программирования, как РНР и С.
В процессе перебора специальный объект LXP с именем for содержит переменную count, в которой хранится текущее значение счетчика цикла. В листинге 13.19 приведен пример простого цикла for с изменением счетчика в интервале от 1 до 5.
Листинг 13.19. Простой цикл <for>.
<lхр> <for start="1" end="5"> Iterating loop: <putvar name="for.count" /><br /> </fon> </lxp>
При обработке этого блока будет выведен следующий результат:
Iterating loop: 1<br /> Iterating loop: 2<br /> Iterating loop: 3<br /> Iterating loop: 4<br /> Iterating loop: 5<br />
Цикл for оказывает неоценимую помощь при работе с массивами, элементы которых требуется вернуть средствами LXP. Как упоминалось ранее, если при определении после имени переменной следуют квадратные скобки ([ ]), LXP автоматически создает массив значений, связанных с этим именем, при этом каждый элемент массива определяется целочисленным индексом. LXP также создает объектную переменную с тем же именем, но без квадратных скобок, с двумя переменными size и last. Переменная size (например, my_array.size) содержит количество элементов в массиве, а переменная last (например, my_array.last) – индекс последнего элемента.
В листинге 13.20 продемонстрирован вывод элементов массива my_array[].
Листинг 13.20. Вывод элементов массива в цикле <for>.
<lхр> <for start="0" end="@my_array.last"> Here is the value of my_array .at offset <putvar name="for.count" />: <putvar name="my_array[@for.count]" /> <br /> </for> </lxp>
Обратите внимание: знак @ используется с объектом my_array только в том случае, когда нужно получить значение переменной, а не ее имя. В теге <putvar> он отсутствует, поскольку атрибут name должен содержать имя переменной, а не ее значение.
Внимание
Вместо автоматического создания массива (в виде my_array[]) можно присваивать индексы элементов вручную (например, my_array[0], my_array[1]), но в этом случае LXP не устанавливает значения переменных size и last.