Элемент <option> в PHP
<html><body> <?php function selectItems($items, $selected=0) { $text = ""; foreach($items as $k=>$v){ if($k == $selected) $ch = " selected"; else $ch = ""; $text .= "<option$ch value='$k'>$v</option>\n"; } return $text; } $names = array( "Weaving" => "Hugo", "Goddard" => "Paul", "Taylor" => "Robert", ); if(isset($_REQUEST['surname'])){ $name = $names[$_REQUEST['surname']]; echo "Вы выбрали: {$_REQUEST['surname']} - {$name} "; } ?> <!-- Форма для выбора имени человека --> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post"> Выберите имя: <select name="surname"> <?=selectItems($names, $_REQUEST['surname'])?> </select><br> <input type="submit" value="Узнать фамилию"> </form> </body></html> НЕ совсем понятна передача параметров функции. Не понятны вот эти 2 строки, как они работают if($k == $selected) $ch = " selected"; else $ch = ""; $text .= "<option$ch value='$k'>$v</option>\n"; И как происходит работа с вот этим элементом формы: <select name="surname"> <?=selectItems($names, $_REQUEST['surname'])?> </select><br> |
1)И что там сложного? Если элемент совпадает с выбранным, то у него ставится флаг selected
2) selectItems по массиву данных и выбранному элементу возвращает сформированную строчку из option |
Что-то не могу понять что делает свойство selected? Прочитал здесь http://htmlbook.ru/html/option/selected - Делает текущий пункт списка выделенным.
В каком смысле выделенным? Сделал тестовое задание по той ссылке выше, не увидел различия со свойством selected и без него. Что он делает? Ещё в чем разница <option selected="selected"><option> от <option selected><option> ?? |
Цитата:
selected делает пункт выделенным, среди других пунктов, у которых нет selected: <option>Раз</option> <option>Два</option> <option selected="selected" >Три</option> <option>Четыре</option> выделен по умолчанию будет пункт "Три". |
Точно, спс. Немного по поводу кода.
Скажите ,вот когда мы написали "<select name="surname">" это равносильно мы создали переменную $surname с которой можем делать что угодно? Ещё, немного не понятно, каким образом попадают в глобальный ассрциативный массив REQUEST значения surname(Фамилия) с массива $names? Если да, каким образом? |
После сабмита формы все поля попадают в массивы ключами ,в $_POST $_GET итд
переменные $surname создаются, только если включено register_global=on в настройках пхп. |
Цитата:
щас распишу логику всего твоего скрипта: 1. функция selectItems, в неё передаётся массив всех пунктов списка ($items)+ выбранный (номер по порядку от 0) — $selected (если его нет, то оно равно 0) function selectItems($items, $selected=0) { 2. Переданный массив $items циклом разбивается на пары: ключ — значение: $k — ключ, $v — значение. Если текущий ключ равен тому же, что пришло в функцию вторым параметром ($selected), то в переменную $text заносится: <option selected value='Значение из текущей $k'> значение текущей $v</option> Если не равен: <option value='значение текущей $k'> значение текщей $v</option> ну и возвращается $text. $text = ""; foreach($items as $k=>$v){ if($k == $selected) $ch = " selected"; else $ch = ""; $text .= "<option$ch value='$k'>$v</option>\n"; } return $text; } 3. Создаётся массив с именами и фамилиями. $names = array( "Weaving" => "Hugo", "Goddard" => "Paul", "Taylor" => "Robert", ); 4. Если по GET или POST на сервер в массиве $_REQUEST пришло surname (т.е. фамилия, заполненная в форме), то $name равна имени из массива $names, где ключ равен пришедшей фамилии surname. Ну и выводится на экран "Вы выбрали...." if(isset($_REQUEST['surname'])){ $name = $names[$_REQUEST['surname']]; echo "Вы выбрали: {$_REQUEST['surname']} - {$name} "; } ?> А тут форма, отправляющая на эту же страницу ($_SERVER['SCRIPT_NAME'] = текущий адрес скрипта) значения выбранного поля surname (то, что потом принимается в $_REQUEST['surname']). И с помощью функции selectItems, куда передаётся массив всех имен/фамилий и текущая полученная фамилия (если страница только что открыта — текущей фамилии не будет, и второй параметр в функции станет равен нулю — т.е выбранным окажется первый пункт. <!-- Форма для выбора имени человека --> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post"> Выберите имя: <select name="surname"> <?=selectItems($names, $_REQUEST['surname'])?> </select><br> <input type="submit" value="Узнать фамилию"> </form> </body></html> |
А в этой строке: <?=selectItems($names, $_REQUEST['surname'])?>
$names - это в первый параметр функции подставился сам массив name который описан выше? В массиве цикл форич он возвращает за первым разом в первый параметр $names попадает значение "Weaving", 2 раз - "Goddard", 3-ий раз - "Taylor" после отправки формы? Во второй параметр также после отправки формы из-за цикла формч, тоже 3 раза во второй параметр попадают значения ключей цикла форич? |
Цитата:
в функцию один раз передаётся массив: $names = array( "Weaving" => "Hugo", "Goddard" => "Paul", "Taylor" => "Robert", ); и один раз передается второй параметр, который равен выбранной фамилии (той, которая была выбрана в форме), если выбрана не была ни одна фамилия, то передаётся 0. К примеру, массив фамилий/имён у нас есть, а из формы было передано Goddard. и дальше три шага цикла: (дословно: пока есть значения в $names, разбить из попарно) Шаг 1: $k = Weaving. $v = Hugo. Weaving не равно Goddard, поэтому добавляем строчку: <option value='Weaving'>Hugo</option> Шаг 2: $k = Goddard. $v = Paul. Goddard равно Goddard, поэтому добавляем строчку: <option selected value='Goddard'>Paul</option> Шаг 3: $k = Taylor. $v = Robert. Taylor не равно Goddard, поэтому добавляем строчку: <option value='Taylor'>Robert</option> |
Часовой пояс GMT +3, время: 21:37. |