В списках множественного выбора можно выбрать не одно, а сразу несколько значений. Чтобы сделать список с множественным выбором, необходимо для тега SELECT указать атрибут multiple:
<select name=month2 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>
После отправки формы параметры передаются так: name = value 1& name = value 2& name = value 3...
Переменная $name = month 2 будет содержать только последнее значение (value N).
Пусть выбрали Ma й и Август. Тогда после отправки формы сценарию придет строка параметров month 2 = Ma й& month 2 = Август, и в переменной $_REQUEST [' month 2'] окажется, конечно, только Август.
Первый пункт (Ma й) потерялся. Для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде «массива с индексами» month 2[](квадратные скобки - это признак массива.):
<select name=”month2[]”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>
Теперь сценарию придет строка month2[]= Maй&month2[]= Август.
Интерпретатор обнаружит, что мы хотим создать «автомассив», т. е. массив, который не содержит пропусков и у которого индексация начинается с нуля. Интерпретатор создаст запись $_REQUEST [' month 2'] типа «массив», содержимое которого следующее: 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>
Листинг hello 2. php . Обработка списка с множественным выбором при включенной директиве register _ globals
<?php
echo “<b г ><b> Список month2: </b><br>” ;
foreach ($month2 as $key=>$value)
echo “$key = $value <br>”;
?>
В окне браузера форма выглядит следующим образом:
Природа этой ошибки подробно будет рассмотрена в п. 3: «Какой режим выбрать: register _ globals = off & on ?». Здесь заметим лишь, что мы обратились к переменной $ month 2 как к глобальной, что требует наличия включенной директивы register _ globals = on . Если эта директива отключена (register _ globals = off), что настоятельно рекомендуется делать, то нужное значение можно получить через глобальный массив $_ REQUEST [' month 2']. Поэтому сделаем необходимые исправления.
Листинг hello 2. 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>”;
?>
Видно, что РНР совершенно нет никакого дела до того, в каких элементах формы мы используем автомассивы — он в любом случае обрабатывает все одинаково. И это, пожалуй, не только правильно, но и удобно.
Обработка массивов
Рассмотрены почти все возможности РНР по автоматической трансляции данных формы. Напоследок взглянем на еще одно полезное свойство РНР. Пусть имеется такая форма:
Листинг 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>”;
?>
Дата: 2019-04-23, просмотров: 245.