p align="left"><option value=05>Maй</option> <option value=06>Июнь</option> <option value=07>Июль</option> <option value=08>Август</option> <option value=09>Ceнтябрь</option> <option value=10>Oктябрь</option> <option value=11>Hоябрь</option> <option value=12>Декабрь</option> </select> Теперь сценарию придет строка month2[]= Maй&month2[]= Август. Интерпретатор обнаружит, что мы хотим создать «автомассив», т. е. массив, который не содержит пропусков и у которого индексация начинается с нуля. Интерпретатор создаст запись $_REQUEST ['month2'] типа «массив», содержимое которого следующее: array (0=>» Maй «, l=>» Август «). Как мы видим, в результате ничего не пропало -- данные только слегка видоизменились. В результате мы получим в $_REQUEST массив массивов (или двумерный массив, как его еще называют). Таким образом, множественный список преобразован в массив. Массив представляет собой индексированную совокупность переменных одного типа. Каждая переменная или элемент массива имеет свой индекс, т.е. все элементы массива последовательно пронумерованы. Обход массива в цикле организуют (обрабатывают его элементы) с помощью цикла foreach. Принцип работы этого цикла прост: при проходе каждого элемента массива в переменную $key помещается индекс этого элемента, а в переменную $value - его значение. Нам даже не нужно знать количество переданных элементов списка. Предварительно лишь нужно сообщить РНР, что мы будем передавать массив: <select name”month2[]”size=4 multiple> Напомним, что квадратные скобки -- это признак массива. Обрабатывается массив так: foreach($month2 as $key=>$value) echo “$key = $value <br>”; Листинг month2.html. Форма списка с множественным выбором <html> <head> <title>Обработка списка с множественным выбором</title> </head> <body> <form action=hello2.php> <select name=”month2[]” size=4 multiple> <option value=01>Январь</option> <option value=02>Февраль</option> <option value=03>Mapт</option> <option value=04>Апрель</option> <option value=05>Maй</option> <option value=06>Июнь</option> <option value=07>Июль</option> <option value=08>Август</option> <option value=09>Ceнтябрь</option> <option value=10>Oктябрь</option> <option value=11>Hоябрь</option> <option value=12>Декабрь</option> </select><br> <input type=submit vа1ue = “Нажмите кнопку, чтобы запустить сценарий! «> </form> </body> </html> Листинг hello2.php. Обработка списка с множественным выбором при включенной директиве register_globals <?php echo “<bг><b>Список month2: </b><br>” ; foreach ($month2 as $key=>$value) echo “$key = $value <br>”; ?> В окне браузера форма выглядит следующим образом: Природа этой ошибки подробно будет рассмотрена в п. 3: «Какой режим выбрать: register_globals = off & on?». Здесь заметим лишь, что мы обратились к переменной $month2 как к глобальной, что требует наличия включенной директивы register_globals=on. Если эта директива отключена (register_globals=off), что настоятельно рекомендуется делать, то нужное значение можно получить через глобальный массив $_REQUEST['month2']. Поэтому сделаем необходимые исправления. Листинг hello2.php. Обработка списка с множественным выбором при отключенной директиве register_globals <?php echo “<bг><b>Список month2: </b><br>” ; foreach ($_REQUEST['month2'] as $key=>$value) echo “$key = $value <br>”; ?> Прием с автомассивом в поле <seiect multiple> для списка с множественным выбором выглядит довольно элегантно. Однако не стоит думать, что он применим только к этому элементу формы: автомассивы можно применять и в любых других полях. Вот пример, создающий два переключателя (кнопки со значениями вкл/выкл), один элемент ввода строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива: Листинг txt.html. Применение автомассивов <html> <head> <title>Применение автомассивов</title> </head> <body> <form action=hello3.php> <input type=checkbox name=Arr[] value=chl> <input type=checkbox name=Arr[] value=ch2> <input type=text name=Arr[] value=”Однострочный текст”> <textarea name=Arr[]>Многострочный текст</textarea> <input type=submit vа1ue = “Нажмите кнопку, чтобы запустить сценарий! «> </form> </body> </html> В окне браузера форма выглядит следующим образом: Листинг hello3.php. Сценарий обработки автомассивов <?php echo “<bг><b>Список month3: </b><br>” ; foreach ($_REQUEST['Arr'] as $key=>$value) echo “$key = $value <br>”; ?> Видно, что РНР совершенно нет никакого дела до того, в каких элементах формы мы используем автомассивы -- он в любом случае обрабатывает все одинаково. И это, пожалуй, не только правильно, но и удобно. 2.6. Обработка массивов Рассмотрены почти все возможности РНР по автоматической трансляции данных формы. Напоследок взглянем на еще одно полезное свойство РНР. Пусть имеется такая форма: Листинг txt1.html. Форма для примера «Обработка массивов» <html> <head> <title>Обработка массивов</title> </head> <body> <form action=hello4.php> Имя: <input type=text name=Data[name]><br> Адрес: <input type=text name=Data[address]><br> Город: <br> <input type=radio name=Data[city] value=Newomoscow>Новомocковск<br> <input type=radio name=Data[city] value=Kiev>Kиев<br> <input type=submit vа1ue = “Нажмите кнопку, чтобы запустить сценарий! «> </form> </body> </html> В окне браузера форма выглядит следующим образом: После передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов. В сценарии к отдельным элементам формы можно обратиться при помощи указания ключа массива: например, $_REQUEST ['Data'] ['city'] обозначает значение той радиокнопки, которая была выбрана пользователем, а $_REQUEST ['Data'] ['name'] -- введенное имя. Предупреждение. В сценарии обязательно нужно заключать ключи в кавычки или апострофы. В противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы, наоборот, нужно их избегать -- так устроен РНР. Напишем сценарий. Листинг hello4.php. Сценарий для обработки массива <?php echo “<bг><b>Список month4 </b><br>” ; foreach ($_REQUEST['Data'] as $key=>$value) echo “$key = $value <br>”; ?> 2.7. Особенности обработки независимых переключателей Рассмотрим вопрос, который находит частое практическое применение в Web-программировании. Независимый переключатель (checkbox или более коротко -- флажок) имеет одну довольно неприятную особенность, которая иногда может помешать Web-программисту. Если перед отправкой формы пользователь установил независимый переключатель в выбранное состояние, то сценарию в числе других параметров приходит пара имя_флажка=значение. В то же время, если флажок не был установлен пользователем, указанная пара не посылается. Для упрощения обработки, хотелось бы, чтобы в невыбранном состоянии флажок также присылал данные, но только значение было равно какой-нибудь специальной величине -- например, нулю или пустой строке. Добиться этого эффекта в РНР довольно несложно. Достаточно воспользоваться одноименным скрытым полем (hidden) со значением, равным, например, нулю, поместив его перед нужным флажком. Листинг checkbox.php. Особенности обработки независимых переключателей <?php # # Гарантированный прием значений от флажков. if (@$_REQUEST['doGo'] ) { foreach (@$_REQUEST ['known'] as $k=>$v) { if($v) echo «Вы знаете язык $k!<br>»; else echo «Вы не знаете языка $k. <br>»; } } ?> <form action=”<?=$_SERVER['SCRIPT_NAME']?>” method=post> Какие языки программирования вы знаете?<br> <input type=hidden name=”known[PHP]” value=”0”> <input type=checkbox name=”known[PHP]” value=”l”>PHP<br> <input type=hidden name=”known[Perl] “ value=”0”> <input type=checkbox name=”known[Perl]” value=”l”>Perl<br> <input type=submit name=”doGo” value=”Go!”> </form> Инструкция foreach предназначена для перебора всех элементов массива, указанного в ее первом аргументе.
Страницы: 1, 2, 3, 4, 5, 6, 7
|