Как я могу упростить этот PHP-скрипт?

#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. Спасибо за ваше предложение.