Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [ 49 ] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

( Замечание

Подробнее про ассоциативные массивы и автомассивы читайте в главе 10.

Все же, забегая вперед, еще несколько слов об автомассивах. Рассмотрим такой несложный пример программы:

$A[]=10; $A[]=20; $A[]=30;

После отработки этих строк будет создан массив $A, заполненный последовательно числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных скобок при присваивании элементу массива не указано ничего, то подразумевается элемент массива, следующий за последним. В общем-то это должно быть интуитивно понятным - именно на легкость в использовании и ориентировались разработчики PHP.

Прием с автомассивом в поле <select multiple>, действительно, выглядит довольно элегантно. Однако не стоит думать, что он применим только к этому элементу формы: автомассивы мы можем применять и в любых других полях. Вот пример, создающий 2 переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива:

<input type=checkbox name=Arr[] value=ch1> <input type=checkbox name=Arr[] value=ch2> <input type=text name=Arr[] value="Some string"> <textarea name=Arr[]>Some text</textarea>

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

</select>

Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого индексация начинается с нуля), и, действительно, создаст переменную $sel типа массив, содержимое которого следующее: array(0=>"First", 1=>"Third"). Как мы видим, в результате ничего не пропало - данные только слегка видоизменились.



Если верить официальной документации, то многомерные массивы (то есть, массивы массивов) указывать нельзя. Например, при передаче данных поля,

определенного как<input type=text name=Silly[one][two][three]>в программе, действительно, создастся массив $Silly, но он будет одномерный и с ключом one][two][three - совсем не то, что мы ожидали, не правда ли? В принципе, при большом желании можно написать функцию, которая конвертирует такие "испорченные" массивы в нормальное многомерное представление, но это выходит за рамки нашего обзора.

К счастью, похоже, разработчики PHP поняли, что неработоспособность многомерных массивов при передаче их из формы серьезно снижает популярность PHP. Поэтому они наконец-то включили в PHP поддержку последних. Ура! Например, в моей версии PHP 4.0.3 (самой свежей на момент написания этих строк) они уже работают.

Трансляция массивов

В сущности, мы уже рассмотрели почти все возможности PHP по автоматической трансляции данных формы. Напоследок взглянем на еще одно полезное свойство PHP. Пусть у нас есть такая форма (листинг 8.7):

\ Листинг 8.7. Трансляция массивов

Имя: <input type=text name=Data[name]><br> Адрес: <input type=text name=Data[address]><br> Город:<br>

<input type=radio name=Data[city] value=Moscow>Москва<br>

<input type=radio name=Data[city] value=Peter>Санкт-Петербург<br>

<input type=radio name=Data[city] value=Kiev>Киев<br>

Можно догадаться, что после передачи подобных данных сценарию на PHP в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city (ассоциативные массивы мы также затрагивали пока только вскользь, но очень скоро этот пробел будет достойно восполнен). То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов.

Забегая вперед, скажу, что в сценарии к отдельным элементам формы можно будет обратиться при помощи указания ключа массива: например, $Data[city] обозначает значение той радиокнопки, которая была выбрана пользователем, а $Data["name"] - ее имя. Заметьте, что в сценарии мы обязательно должны заключать ключи в кавычки или апострофы - в противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы мы, наоборот, должны их избегать - уж так устроен PHP.



Впрочем, в документации по-прежнему заявлено, что "многомерные массивы использовать нельзя". Что это - ошибка или злая шутка?..

Как же проверить, можно ли использовать многомерные массивы при обработке форм в вашей версии PHP? Нет ничего проще! Достаточно запустить следующий сценарий (листинг 8.8).

i Листинг 8.8. testarr.php: работают ЛИ многомерные массивы?

<?

оператор @ нужен, для того чтобы подавить предупреждение, если переменная еще не б1ла инициализирована. if(@$go) {

if(@$A[10][20]=="Yes") {

echo "<h1>МногомернIе массивы работают!";

} else {

echo "Многомерн1е массивы НЕ работают!";

} else {

echo "<h1>Testing, wait...</h1>"; echo "<meta http-equiv=Refresh ";

echo "content=0; URL=$REQUEST URI?go=1&A[1][2]=Yes>";

?>

Вот вкратце, как он работает. При первом запуске переменная $go не инициализирована, поэтому управление получает блок, выводящий тэг <meta>. Он заставляет браузер перезагрузить страницу, но уже с параметрами в командной строке go=1&A[1][2]=Yes. Сценарий запускается снова, но уже на этот раз переменная $go равна 1 (потому что именно такое значение было передано в командной строке). Если многомерные массивы поддержаны, то, очевидно, что элемент массива $A[1][2], которому мы присвоили значение Yes в командной строке, будет существовать и равняться Yes. В этом случае мы получим сообщение, что массивами пользоваться можно, а иначе - что они не работают.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [ 49 ] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189