Дублирование реализации и смешение знаний при рендеринге дропдауна


Исходный код

echo "<select id=\"seltel[".$i."]\">";
switch ($data2["PHONE"][$i]["type"]) {
case "Факс":
echo "<option selected>Факс";
echo "<option>Офисный телефон";
echo "<option>Колцентр";
echo "<option>Телефон";
echo "<option>Мобильный телефон";
break;
case "Офисный телефон":
echo "<option>Факс";
echo "<option selected>Офисный телефон";
echo "<option>Колцентр";
echo "<option>Телефон";
echo "<option>Мобильный телефон";
break;
case "Колцентр":
echo "<option>Факс";
echo "<option>Офисный телефон";
echo "<option selected>Колцентр";
echo "<option>Телефон";
echo "<option>Мобильный телефон";
break;
case "Телефон":
echo "<option>Факс";
echo "<option>Офисный телефон";
echo "<option>Колцентр";
echo "<option selected>Телефон";
echo "<option>Мобильный телефон";
break;
case "Мобильный телефон":
echo "<option>Факс";
echo "<option>Офисный телефон";
echo "<option>Колцентр";
echo "<option>Телефон";
echo "<option selected>Мобильный телефон";
break;
};
echo "</select><br/>";

Как можно улучшить исходный код

Разумеется, нет необходимости столько раз повторять вывод всех опций дропдауна, меняя каждый раз только одну маленькую деталь. Представь, что будет твориться в исходном коде, если опций в дропдауне станет хотя бы 20.

Пятикратно повторенный список опций — это пятикратно повторенная реализация этого списка.

Опять же, тут в одном фрагменте кода смешиваются знания об опциях данного конкретного дропдауна, об общих правилах формирования любого дропдауна и о формировании идентификатора дропдауна.

Подобные задачи решаются с помощью функций, массивов и циклов:

function dropdown($id, $options, $selected) {
    echo "<select id=\"$id\">";
    foreach ($options as $option) {
        $selected_attr = $option === $selected ? ' selected' : '';
        echo "<option$selected_attr>$option</option>";
    }
    echo "</select>";
}
const PHONE_TYPE_OPTIONS = ['Факс', 'Офисный телефон', 'Колцентр', 'Телефон', 'Мобильный телефон'];
dropdown("seltel[$i]", PHONE_TYPE_OPTIONS, $data2["PHONE"][$i]["type"]);

Теория