Если для компьютера строки — это не более чем коллекция символов, то для человека они часто представляют концепции и данные, которые должны следовать определенным соглашениям. И даже когда вы имеете дело с компьютерами, все равно иногда необходимо гарантировать, чтобы содержимое строк следовало определенным правилам. Например, строки, которые должны быть переданы Web-браузеру, должны форматироваться в соответствии со стандартами HTML, чтобы они могли корректно отображаться. В РНР представлен широкий спектр функций, которые могут применяться для форматирования строк во многих случаях. Возможно, наиболее общим примером этой функциональности является функция printf (), синтаксис которой показан ниже: void printf ($format specification[, $parameters...]); Параметр $format_specification — это строка, которая содержит как нормальный текст, выводимый "как есть", так и директивы подстановки, которые заменяются с использованием значений, представленных в части $parameters вызова функции. Директива подстановки имеет следующую форму: %[Р] [-]W[.R]T Т— это тип параметра (см. табл. 1.4), W— минимальная длина, которую должны занимать данные в выходной строке, Р — необязательный символ-заполнитель, который должен использоваться для обеспечения того, чтобы данные занимали минимум W символов.
Таблица 1.4. Спецификаторы типа функции p r i n t f ()
Опция Значение % Литеральный символ процента. а Целое, представленное как двоичное число (например: 101110111). с Целое, представленное как символ с соответствующим ASCII-кодом. d Целое, представленное как целое число со знаком. и Целое, представленное как целое число без знака. f Значение с плавающей точкой. о Целое, представленное как восьмеричное число. s Строковое значение. х Целое, представленное в шестнадцатеричной нотации (с символами в нижнем регистре). X Целое, представленное в шестнадцатеричной нотации (с символами в верхнем регистре). R — это необязательный символ точности, который имеет смысл только в случае
значений с плавающей точкой; он указывает число десятичных разрядов, которые должны быть использованы для представления данных. Наконец, тире (-), расположенное между Р и И, означает, что данные должны быть выровнены влево в пределах ширины поля, заданной W. Все это выглядит намного сложнее, чем есть на самом деле. Давайте рассмотрим несколько примеров: %-5d Эта конструкция представляет выровненное вправо целое значение, которое должно быть как минимум в 5 знаков длиной. %05.3f Эта конструкция представляет значение с плавающей точкой, как минимум пяти знаков длиной и не менее 3 десятичных разрядов после запятой. Символ 0 используется для заполнения строк до минимальной длины. Ниже показан пример.
<?php $п = 15.32; $log = log ($n); printf ("log (%0.2f) = %.5f\n", $n, $log); <?php Сценарий выдает следующую строку: log (15 . 32) = 2 .72916. Для тех из вас, кто имеет опыт программирования на языке С, следует отметить, что printf () не представляет никаких подстановок для управляющих символов с обратным слэшем, таких как \п. Если вы хотите использовать такие специальные символы, убедитесь, что вы указали значение параметра format_specification с применением синтаксиса с двойными кавычками. Если директивы в нем будут найдены, интерпретатор будет проходить от одного параметра к другому до тех пор, пока не выполнит все подстановки.
К сожалению, такой подход может служить причиной некоторых серьезных проблем. Например, рассмотрим случай применения printf () в качестве основы в системе, поддерживающей несколько языков. Предложение на английском:
"The [box/case] contains [three/five] pens" может быть переведено на другой язык с применением другой конструкции, например: "There are [three/five] pens in the [box/case]"
Понятно, что использование printf О для того, чтобы сделать локализованную систему настолько гибкой, чтобы она могла поддерживать конструктивные формы разных языков, может оказаться сложным без возможности указания, какой параметр должен применяться для каждой директивы подстановки. К счастью РНР позволяет это сделать за счет использования слегка измененного синтаксиса. Все, что вам нужно сделать — это предварительно указать в директиве номер параметра с последующим символом доллара ($). Например:
<?php function replace_me ($s) printf ($s, 10, 'box'); replace_me ("There are %d pens in the %s\n"); replacejne ("The %2\$s contains %l\$s pens\n"); <?php
Этот сценарий возвращает корректное значение несмотря на то, что порядок параметров во второй строке меняется (обратите внимание, что символ доллара указан с обратным слэшем, чтобы гарантировать, что он не будет обработан механизмом объявления строк РНР):
There are 10 pens in the box. The box contains 10 pens.
Функция s p r i n t f () принимает те же параметры, что и p r i n t f (), но возвращает строку, которая является результатом ее выполнения: