#php
#php
Вопрос:
Я хотел бы добавить атрибут «выбранный» в поле со списком. Это мой PHP:
if($results['status'] == 1)
{ $ok1= "selected"; }
else
{ $ok1= ""; }
if($results['status'] == 2)
{ $ok2= "selected"; }
else
{ $ok2= ""; }
if($results['status'] == 3)
{ $ok3= "selected"; }
else
{ $ok3= ""; }
if($results['status'] == 4)
{ $ok4= "selected"; }
else
{ $ok4= ""; }
У меня может быть более сотни IF.
Я пробовал этот, но, похоже, он не работает:
for($a=1; $a<=4; $a ){
if($results['status'] == $a)
{ $ok = "selected"; }
else
{ $ok = ""; }
}
Я бы хотел сделать его как можно более простым. может быть, 1 или 2 строки. Потому что у меня есть много полей со списком, которые следует обрабатывать таким образом
Редактировать (мое поле со списком):
<select>
<option value="1" <?php echo $ok1; ?>>A</option>
<option value="2" <?php echo $ok2; ?>>B</option>
<option value="3" <?php echo $ok3; ?>>C</option>
<option value="4" <?php echo $ok4; ?>>D</option>
</select>
Комментарии:
1. Это не имеет смысла. В вашем исходном блоке кода единственный способ, которого
$ok
нет""
, — это if$results['status'] == 4
. В любом другом сценарии для него устанавливается значение""
.2. Где вы создаете HTML?
3. извините, смотрите мою правку.
4. почему некоторые ответы удаляются?
5. проверьте мой ответ Vahn, это то, что вы хотите. приветствия
Ответ №1:
Поскольку $results['status']
может иметь только 1 значение, используйте динамические имена переменных, чтобы упростить себе жизнь!
// initialize all 4 to blank
for($a=1; $a<=4; $a ){
${"ok" . $a} = "";
}
// set the one that is selected
${"ok" . $results['status']} = "selected";
Этот ответ очень масштабируемый, вы можете просто изменить число в строке «для» с 4 на 1000, и он работает без добавления дополнительного кода.
Комментарии:
1. Это работает хорошо. Если ответов нет, это проще, чем этот. Я приму этот ответ.
2. Спасибо. Это то, что я ищу.
Ответ №2:
Вы можете сделать это так,
<?php
// status list array
$selectValues = array(1, 2, 3, 4);
echo '<select name="combo_name">';
foreach($selectValues as $value){
$selected = "";
if($results['status'] == $value){
$selected = ' selected="selected" ';
}
echo '<option '.$selected.' value="'.$value.'">'.$value.'</option>';
}
echo '</select>';
?>
Комментарии:
1. я бы хотел добавить «выбранный» к определенному тегу опции. не создается поле со списком.
2. Поле со списком уже создано перед запуском php-скрипта? Или вы создаете поле со списком во время запуска php-скрипта?
3. Обычно уровень представления выполняется после контроллера (PHP-код). Итак, поле со списком создается после запуска PHP-скрипта.
4. Если сначала создается поле со списком, как вы присваиваете значения «Ok» уже созданному полю со списком. Тогда вам нужно использовать JavaScript.
5. Это хороший подход. Спасибо, я буду иметь это в виду.
Ответ №3:
Все, что вам нужно сделать, это создать массив и перебирать его-
<?php
$results_status = 3; // What ever your retrieve variable value is. In your case: `$results['status']`
$arr = array("1" => "A",
"2" => "B",
"3" => "C",
"4" => "D"
);
?>
<select>
<?php
foreach($arr as $key => $val){
$sel = ($results_status == $key) ? "selected='selected'" : "";
?>
<option value="<?php echo $key?>" <?php echo $sel; ?>><?php echo $val?></option>
<?php }?>
</select>
Вам нужно каждый раз проверять выбранное значение в поле со списком.
Комментарии:
1. Это хороший подход. Спасибо, я буду иметь это в виду.
Ответ №4:
Надеюсь, это поможет
$combolength — количество опций в combo
$ok = array_fill(0, $combolength - 1, '');
switch ($results['status']) {
case $results['status']:
$ok[$results['status']]= 'selected';
break;
}
Комментарии:
1. Это хороший подход. Спасибо, я буду иметь это в виду.
Ответ №5:
Я лично считаю, что «упростить» то, что у вас уже есть, — это не способ сделать это. Если вы не используете фреймворк, я думаю, вам следует вместо этого спросить, как сделать ваш скрипт повторно используемым, тем более, что вы говорите: «У меня есть много полей со списком, которые следует обрабатывать таким образом».Отказ от использования содержащегося элемента, такого как функция / метод, звучит как большая дополнительная работа с точки зрения жесткого кодирования. Я лично создал бы класс, который вы могли бы стандартизировать поля формы и в который вы могли бы вводить массив с помощью динамических массивов ключей / значений. Простой пример:
/core/classes/Form.php
class Form
{
# The idea here is that you would have many methods to build form fields
# You can edit this as you please
public function select($settings)
{
$class = (!empty($settings['class']))? ' class="'.$settings['class'].'"':'';
$id = (!empty($settings['id']))? ' id="'.$settings['id'].'"':'';
$selected = (!empty($settings['selected']))? $settings['selected']:false;
$other = (!empty($settings['other']))? ' '.implode(' ',$settings['other']):'';
ob_start();
?>
<select name="<?php echo $settings['name']; ?>"<?php echo $other.$id.$class; ?>>
<?php foreach($settings['options'] as $key => $value) { ?>
<option value="<?php echo $key; ?>"<?php if($selected == $key) echo ' selected'; ?>><?php echo $value; ?></option>
<?php } ?>
</select>
<?php
$data = ob_get_contents();
ob_end_clean();
return $data;
}
}
Для использования:
# Include the class
require_once(__DIR__.'/core/classes/Form.php');
# You can use $form = new Form(); echo $form->select(...etc.
# but I am just doing this way for demonstration
echo (new Form())->select(array(
'name'=>'status',
'class'=>'classes here',
'id'=>'select1',
'other'=>array(
'data-instructions='{"stuff":["things"]}'',
'onchange="this.style.borderColor='red';this.style.fontSize='30px'"'
),
# Options can be assign database returned arrays
'options'=>array(
'_'=>'Select',
1=>'A',
2=>'B',
3=>'C',
4=>'D'
),
'selected'=>((!empty($results['status']))? $results['status'] : '_')
));
Дает вам:
<select name="status" data-instructions='{"stuff":["things"]}' onchange="this.style.borderColor='red';this.style.fontSize='30px'" id="select1" class="classes here">
<option value="_">Select</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
</select>
Комментарии:
1. Для моей текущей проблемы, я думаю, я буду использовать @Joe T answer. Спасибо за ваше предложение.