Ниже приведён базовый код с комментариями. Предполагается PHP 5.4+
Давно не брал в руки PHP, поэтому конструктивная критика приветствуется, возможно где-нибудь упущена точка с запятой.
function get_data($db_connection, $sql) {
/**
* Задача этой функции - получить данные из БД,
* а также сгруппировать их для последующего использования
* в select элементах формы.
*/
// Здесь мы сохраним всю выборку для последующего
// прохода по ней.
$rows = [];
// Здесь будут хранится возможные значения для select-элементов.
$options = ['year'=>[], 'type'=>[], 'engine'=>[]];
foreach ($db_connection->query($sql) as $row) {
foreach ($options as $key=>&$choices) {
array_push($choices, $row[$key]);
}
array_push($rows, $row);
}
// Вернуть несколько значений из функции можно
// при помощи массива:
return [$rows, $options];
}
function render_data($data) {
/**
* Задача данной функции - отрисовать html,
* наполнив данными, полученными ранее.
*/
// Распаковать массив в локальные переменные позволяет list().
list($rows, $options) = $data;
// Далее с префиксами $tpl_ пойдут строки шаблонов.
// Эти строки содержат маркеры вида {{ что-то }} для
// вставки на эти места реальных данных.
$tpl_row = '
<!-- Это шаблон блока. Он формируется для каждого ряда из БД.
Другие шаблоны вкладываются в него по принципу матрёшки.
Из кубиков собирается целое. -->
<div class="auto-select">
<div class="auto-name">{{ name }}</div>
<div class="auto-image"><img src="{{ image }}"></div>
<div class="options">{{ form }}</div>
</div>';
$tpl_form = '
<!-- Это шаблон формы. Он тоже формируется для каждого ряда из БД. -->
<form id="options" action="../blocks/podbor.php" method="POST">
{{ selects }}
<input type="submit" class="option option-button" >
</form>';
$tpl_select = '
<!-- Это шаблон select элемента формы.
Он формируется для нескольких полей каждого ряда из БД. -->
<select class="option-{{ key }} option" name="{{ key }}">
{{ options }}
</select>';
// Далее с префиксом $func_ идут небольшие вспомогательные
// анонимные функции, замыкания.
// Мы присваиваем эти функции переменным для обращения
// к ним в дальнейшем.
$func_replace = function($tpl, $from, $to) {
// Эта функция заменяет маркеры в строке шаблона на значения.
return str_replace("{{ {$from} }}", $to, $tpl);
};
// В определении этой анонимной функции указаны символы
// внешнего пространства имён при помощи use, чтобы она
// могла к ним обращаться.
$func_make_select = function($row, $key, $choices)
use ($func_replace, $tpl_select) {
// Эта функция формирует select элемент формы.
// При этом делает в нём выбранным текущее значение из БД.
$select_html = $func_replace($tpl_select, 'key', $key);
$options_html = '';
foreach ($choices as $choice) {
$selected = ($row[$key] == $choice ? 'selected' : '');
$options_html .= "<option {$selected}>{$choice}</option>";
}
return $func_replace($select_html, 'options', $options_html);
};
// Ниже следует код наполнения шаблона данными.
$html = '';
foreach ($rows as $row) {
$row_html = $tpl_row;
// Этот цикл заполняет неизменяемые поля name, image.
foreach ($row as $key=>$value) {
$row_html = $func_replace($row_html, $key, $value);
}
$selects_html = '';
// Этот цикл собирает код всех select элементов.
foreach ($options as $option_key=>$choices) {
$selects_html .= $func_make_select($row, $option_key, $choices);
}
// Подставляем полученные выше HTML куски в шаблон.
$form_html = $func_replace($tpl_form, 'selects', $selects_html);
$row_html = $func_replace($row_html, 'form', $form_html);
$html .= $row_html;
}
// Отправляет финальный HTML на вывод.
echo $html;
}
// Вызвать функции выше можно таким способом.
render_data(get_data($db_connection, 'SELECT * FROM title'))
Обратите внимание, что у нас в функции render_data() получился мини-шаблонизатор.
Разумеется, если вы уже используете какой-то, то эта куча кода вам не нужна: достаточно будет создать шаблон — мы определяли его части в переменных с префиксом $tpl_ — и инструктировать ваш шаблонизатор передать в него имеющиеся у вас данные.
Если тема шаблонизаторов вас заинтересовала, можете обратиться к моей старой статье «Шаблоны в шаблонизаторе и как шаблоны Django до PHP дошли (в очередной раз)»