$field) { if ($field === TRUE) $field = array(); if (is_numeric($name)) { $name = $field; $field = array(); } // elseif ($field === 'checkbox') { // с версии 1.40 checkbox отдельно не обрабатываем // $field = array('value' => 1); // } elseif (is_string($field) AND preg_match("'\[([\w;\s]+)\]'", $field, $matches)) { $field = array(); $field['keys'] = array_map('trim', explode(';', $matches[1]) ); } if (!isset($field['name'])) // во вложенный шаблон ^KEY не передашь, $field['name'] = $name; // так что дублируем else $field['name'] .= '[' . $name . ']'; // рассчитано на рекурсивный вызов if (isset($field['attr'])) $field['attr'] = array_map('htmlspecialchars', $field['attr']); if (isset($field['keys'])) { // Если поле в запросе соответствует массиву - разбираем рекурсивно // ("срезаем" один уровень вложенности: например, если есть price[min], // то конструируем массив с конфигурацией полей, состоящий из единственного // элмента - 'min' => (здесь конфигурация для price), и "запрос", // тоже из единственного элемента - 'min' => (здесь значение, к примеру, // $_GET[price][min]). $fn = __FUNCTION__; $stub = $field; // сохраняем полученную конфигурацию в копии, $field = array(); // т.к. структура данных поля изменится // и его нужно набирать заново foreach ($stub['keys'] as $n => $k) { // $nm - имя ключа подмассива if (!is_array($k)) { // эта ветка массива дальше не имеет вложенности $nm = $k; // имя ключа указано в виде простого скаляра $cp = $stub; unset($cp['keys']); // дальше рекурсия не нужна - ключи из копии убираем совсем } else { // следующий уровень - в свою очередь является массивом $nm = $n; // от него берем имя ключа и передаём его содержимое, // дополняя содержимым родительского // Но! Если у дочернего пуст элемент keys - убираем его вовсе // (т.к. он является путем рекурсии) $cp = $k + $stub; if (!isset($k['keys'])) unset($cp['keys']); } $tmp_fields = array($nm => $cp); $tmp_query = (isset($query[$name][$nm])) ? array($nm => $query[$name][$nm]) : array(); $field += $fn($tmp_fields, $tmp_query); } } else { if (isset($field['values'])) { // checkbox или любое множественное поле if (is_callable($field['values'])) $field['values'] = $field['values']($query); // С версии 1.42 (25.10.2016) в качестве ключей values используем порядковые номера элементов, поскольку использование в качестве ключа самих значений может вызвать проблемы (например, если значением является пустая строка - актуально для первой, "пустой", опции или