Примеры строк ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0, TЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-TBп(2)-0-1, ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0 Строка например ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0 она указывается в форме отправляется на сервер в обработку в PHP Эта строка должна заменить кириллицу оставить не тронутой, а любое совпадения букв с латиницы и кириллице заменить на латиницу Например C и С разные оставить C на латинице Поднять все верхний регистр даже оставшиеся кириллицу Строка ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0 разбирается через - девиз И каждый параметр проверяется в массиве, сам массив берется из БД sqlite После для каждого отдельного СФ1 или Т3 и т.д. после как нашли применяем различные условия выбора данных из БД По итогу строка должна выдавать обратно на запрос данные где каждый параметр что то означает Возможно парсить запрос перед отправкой на сервер заменяя возможные совпадающие буквы кириллицы на латиницу или на сервере

Для решения задачи обработки строки вида ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0 с заменой кириллических букв, совпадающих с латиницей, на латинские, преобразованием в верхний регистр и последующим парсингом на сервере с проверкой параметров в базе данных SQLite, я предлагаю следующий подход. Ответ включает пример реализации на PHP для сервера, а также рекомендации по предварительной обработке на клиенте, если это необходимо.

Шаги решения

  1. Замена кириллических букв на латиницу:
    • Определяем пары совпадающих букв (например, кириллическая С → латинская C, кириллическая А → латинская A).
    • Оставляем уникальные кириллические буквы (например, Т, Л, Ф) без изменений.
    • Преобразуем строку в верхний регистр, включая оставшуюся кириллицу.
  2. Разбор строки:
    • Разделяем строку по дефису (-) на параметры.
    • Проверяем каждый параметр на соответствие значениям из базы данных SQLite.
  3. Обработка на сервере:
    • Подключаемся к базе данных SQLite.
    • Проверяем каждый параметр в соответствующих таблицах или массивах, хранящихся в базе.
    • Применяем условия для каждого параметра (например, для СФ1, Т3 и т.д.).
    • Формируем ответ с описанием каждого параметра.
  4. Опциональная предварительная обработка на клиенте:
    • Если требуется обработка перед отправкой, используем JavaScript для замены кириллицы на латиницу.

Реализация

1. Замена кириллицы на латиницу и преобразование в верхний регистр

Создадим массив соответствия кириллических и латинских букв, которые визуально совпадают:

php
function transliterateToLatin($string) { $translitMap = [ 'А' => 'A', 'В' => 'B', 'Е' => 'E', 'К' => 'K', 'М' => 'M', 'Н' => 'H', 'О' => 'O', 'Р' => 'P', 'С' => 'C', 'Т' => 'T', 'У' => 'Y', 'Х' => 'X' ]; // Преобразуем строку в верхний регистр $string = mb_strtoupper($string, 'UTF-8'); // Заменяем только совпадающие кириллические буквы на латинские foreach ($translitMap as $cyr => $lat) { $string = str_replace($cyr, $lat, $string); } return $string; }

Пример:

php
$input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0'; $output = transliterateToLatin($input); echo $output; // Вывод: ТЛ-CФ1-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0

Здесь:

  • Кириллические С, А, В, Н, Т, У заменены на латинские C, A, B, H, T, Y.
  • Уникальные кириллические буквы Т, Л, Ф остались без изменений.
  • Вся строка приведена к верхнему регистру.

2. Разбор строки и проверка параметров

Предположим, что база данных SQLite содержит таблицу parameters, где хранятся допустимые значения параметров и их описания. Пример структуры таблицы:

sql
CREATE TABLE parameters ( param_name TEXT, param_value TEXT, description TEXT );

Пример PHP-кода для обработки строки:

php
function processString($inputString) { // Транслитерация строки $processedString = transliterateToLatin($inputString); // Разделение строки на параметры $params = explode('-', $processedString); // Подключение к базе данных SQLite $db = new PDO('sqlite:parameters.db'); $result = []; foreach ($params as $param) { // Запрос к базе данных для проверки параметра $stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ?'); $stmt->execute([$param]); $description = $stmt->fetchColumn(); if ($description) { $result[$param] = $description; } else { $result[$param] = 'Параметр не найден в базе данных'; } } return $result; } // Пример использования $input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0'; $result = processString($input); print_r($result);

Пример вывода (зависит от данных в базе):

php
Array ( [ТЛ] => Тип устройства: ТЛ [CФ1] => Модификация: СФ1 [A111] => Код модели: A111 [005] => Серийный номер: 005 [Bн[Y]] => Вариант исполнения: Вн[У] [T3] => Тип соединения: T3 [80] => Параметр 80 [H33] => Код настройки: H33 [10] => Длина: 10 [Ф] => Функция: Ф [ПК1] => Подключение: ПК1 [КБн(0)] => Конфигурация: КБн(0) [0] => Резерв: 0 )

3. Условия для параметров

Для каждого параметра можно добавить специфические условия. Например:

php
function applyConditions($param, $db) { $conditions = [ 'CФ1' => function($db) { $stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ? AND category = "modification"'); $stmt->execute(['CФ1']); return $stmt->fetchColumn() ?: 'Модификация не найдена'; }, 'T3' => function($db) { $stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ? AND category = "connection"'); $stmt->execute(['T3']); return $stmt->fetchColumn() ?: 'Тип соединения не найден'; } // Другие параметры... ]; return isset($conditions[$param]) ? $conditions[$param]($db) : 'Общее описание параметра'; } // Модификация функции processString function processString($inputString) { $processedString = transliterateToLatin($inputString); $params = explode('-', $processedString); $db = new PDO('sqlite:parameters.db'); $result = []; foreach ($params as $param) { $result[$param] = applyConditions($param, $db); } return $result; }

4. Предварительная обработка на клиенте (опционально)

Если требуется обработка перед отправкой на сервер, можно использовать JavaScript:

javascript
function transliterateToLatin(str) { const translitMap = { 'А': 'A', 'В': 'B', 'Е': 'E', 'К': 'K', 'М': 'M', 'Н': 'H', 'О': 'O', 'Р': 'P', 'С': 'C', 'Т': 'T', 'У': 'Y', 'Х': 'X' }; str = str.toUpperCase(); return str.replace(/[АВЕКМНОРСТУХ]/g, match => translitMap[match] || match); } const input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0'; const output = transliterateToLatin(input); console.log(output); // Вывод: ТЛ-CФ1-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0 // Отправка на сервер fetch('/process.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code: output }) }) .then(response => response.json()) .then(data => console.log(data));

5. Обработка на сервере через API

Пример PHP-скрипта для обработки запроса:

php
<?php header('Content-Type: application/json'); $input = json_decode(file_get_contents('php://input'), true)['code']; $result = processString($input); echo json_encode($result); ?>

Примечания

  • База данных: Убедитесь, что структура таблицы parameters соответствует вашим требованиям. Например, добавьте столбец category для категоризации параметров (modification, connection и т.д.).
  • Ошибки: Добавьте обработку ошибок, например, для случаев, когда строка некорректна или база данных недоступна.
  • Безопасность: Используйте подготовленные запросы (prepare) для защиты от SQL-инъекций.
  • Расширяемость: Логику условий (applyConditions) можно расширить, добавляя новые параметры и их обработку.

Если у вас есть конкретные данные о структуре базы данных или дополнительные условия для параметров, напишите, и я адаптирую решение.

1,3s
Скину массив полный из БД всех параметров соответствия сможешь разобраться сопоставить запросами ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0, TЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-TBп(2)-0-1, ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0 чтобы найти в БД нужные параметры ? Array ( [1] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">С1</strong></div> [1] => <p><strong id="isPasted">С2</strong></p> [2] => <p><strong id="isPasted">С3</strong></p> [3] => <p><strong id="isPasted">СФ1</strong></p> [4] => <p><strong id="isPasted">СФ2</strong></p> [5] => <p><strong id="isPasted">СВ1</strong></p> [6] => <p><strong id="isPasted">СВ2</strong></p> [7] => <p><strong id="isPasted">СВ3</strong></p> [8] => <p><strong id="isPasted">П</strong></p> [9] => <p><strong id="isPasted">П1</strong></p> [10] => <p><strong id="isPasted">П2</strong></p> [11] => <p><strong id="isPasted">П3</strong></p> ) [fields] => Array ( [0] => <div>Стержневая типа 1</div> [1] => <p>Стержневая типа 2&nbsp;</p> [2] => <p>Стержневая типа 3</p> [3] => <p>Стержневая с фланцем типа 1</p> [4] => <p>Стержневая с фланцем типа 2</p> [5] => <p>Стержневая встраиваемая типа 1</p> [6] => <p>Стержневая встраиваемая типа 2</p> [7] => <p>Стержневая встраиваемая типа 3</p><div class="pageidnext">&nbsp;</div> [8] => <p>Профильная</p> [9] => <p>Профильная типа 1</p> [10] => <p>Профильная типа 2</p> [11] => <p>Профильная типа 3</p> ) ) [2] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">А [1] [2] [4] [5]* / А1 [1] [2] [3]</strong></div> [1] => <p><strong id="isPasted">S [1] [2] [3] [4] [5] [6]</strong></p> [2] => <p><strong id="isPasted">SS [1] [2]</strong></p> [3] => <p><strong id="isPasted">C [1] [2] [3] [4] [5]</strong></p> [4] => <p><strong id="isPasted">PN [1] [2] [3]</strong></p> [5] => <p><strong id="isPasted">PB [1] [2] [3]</strong></p> [6] => <p><strong id="isPasted">E [1] [2]</strong></p> [7] => <p><strong id="isPasted">ET [1] [2]</strong></p> [8] => <p><strong id="isPasted">М [1] [2] [3]</strong></p> ) [fields] => Array ( [0] => <div id="isPasted">Аналоговый выходной сигнал</div><div><strong>[1]</strong> – тип сигнала: 1) 4…20 мА; 2) 0…20 мА; 3) -20…+20 мА; 4) 0…24 мА; 5) &nbsp;-10…+10 В; 6) 0…+10 В; 7) 0…+5 В; 8) -5…+5 В; 9) 0,5…4,5 В; 10) 0,25…4,75 В</div><div><strong>[2]</strong> – направление движения: 0 – вперед; 1 – назад 2 – вперед-назад</div><div><strong>[3]&nbsp;</strong>– измеряемый параметр: 0 – положение; 1 – скорость; 2 – дельта расстояния</div><div><strong>[4]</strong> – ток ошибки: 0 – Сохранить исходное значение; 1 – максимальное значение; 2 – минимальное значение</div><div><strong>[5]*&nbsp;</strong>– Схема подключения: 2 – Двухпроводная; 4 – Четырехпроводная&nbsp;</div><div>*Примечание –<strong>&nbsp;</strong>только для исполнения ТЛ-С1 тип 4</div> [1] => <p id="isPasted">SSI – синхронный последовательный интерфейс<br><strong>[1]</strong> – длина массива данных: 1 – 25 бит; 2 – 24 бит; 3 – 26 бит<br><strong>[2]</strong> – кодировка: В – двоичная; G – код Грея<br><strong>[3]</strong> – разрешение (мм) 1 – 0,005; 2 – 0,01; 3 – 0,05; 4 – 0,1; 5 – 0,02; 6 – 0,002; 7 – 0,0001; 8 – 0,001; 9 – 0,0005; 10 – 0,04<br><strong>[4]</strong> – исполнение: 1 – стандарт; 8 – шумоподавляющий фильтр (8 измерений); D – без фильтра + подавление ошибок 10 циклов; G – шумоподавляющий фильтр (8 измерений) + подавление ошибок.<br><strong>[5] [6]</strong> – опции: 00 – направление измерений вперед; 01 – направление измерений назад; 02 – направление измерений вперед, синхронное измерение; 05 – направление измерений вперед, бит 25 = тревога, бит 26 = проверка на четность; 16 – направление измерений вперед внутренняя линеаризация; 99 – опция для других комбинаций.</p><div class="pageidnext">&nbsp;</div> [2] => <p id="isPasted">Start/Stop - интерфейс Старт/Стоп<br><strong>[1]</strong> – направление движения: 0 – вперед; 1 – назад<br><strong>[2]</strong> – количество позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.; 9 – 9 шт.</p> [3] => <p id="isPasted">CANopen – интерфейс CANopen<br><strong>[1]</strong> – тип протокола: 1 – CANopen; 2 – CANBasic<br><strong>[2]</strong> – скорость передачи данных: 1 – 1000 кбит/с; 2 – 800 кбит/с; 3 – 500 кбит/с; 4 – 250 кбит/с; 5 – 125 кбит/с; 6 – 100 кбит/с; 7 – 50 кбит/с; 8 – 20 кбит/с<br><strong>[3]</strong> – разрешение: 1 – 0,1 мм; 2 – 0,05 мм; 3 – 0,02 мм; 4 – 0,01 мм; 5 – 0,005 мм; 6 – 0,002 мм; 7 – 0,001 мм<br><strong>[4]</strong> – количество позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.; 9 – 9 шт.&nbsp;<br><strong>[5]&nbsp;</strong>– Файл конфигурации устройства: T – ТЛ; M – MTS Sensors; B - Balluff</p> [4] => <p id="isPasted">Profinet IO RT – интерфейс Profinet<br><strong>[1]</strong> – количество позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.; 9 – 9 шт.<br><strong>[2]</strong> – разрешение: 0 - стандарт 1 – 0,1 мм; 2 – 0,05 мм; 3 – 0,02 мм; &nbsp;4 – 0,01 мм; 5 – 0,005 мм; 6 – 0,002 мм; 7 – 0,001 мм<br><strong>[3]&nbsp;</strong>– Файл конфигурации устройства: T – ТЛ; M – MTS Sensors; B - Balluff</p> [5] => <p id="isPasted">Profibus-DP System – интерфейс Profibus-DP<br><strong>[1]</strong> – количество позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.; 9 – 9 шт.<br><strong>[2]</strong> – разрешение: 0 – стандарт; 1 – 0,1 мм; 2 – 0,05 мм; 3 – 0,02 мм; 4 – 0,01 мм; 5 – 0,005 мм; 6 – 0,001 мм<br><strong>[3]&nbsp;</strong>– Файл конфигурации устройства: T – ТЛ; M – MTS Sensors; B - Balluff</p> [6] => <p id="isPasted">EtherCAT – интерфейс EtherCAT<br><strong>[1]</strong> – количество позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.; 9 – 9 шт.<br><strong>[2]&nbsp;</strong>– Файл конфигурации устройства: T – ТЛ; M – MTS Sensors; B - Balluff</p> [7] => <p>Ethernet/IP – интерфейс Ethernet/IP<br id="isPasted"><strong>[1]&nbsp;</strong>– исполнение: 0 – стандарт<br><strong>[2]&nbsp;</strong>– кол-во позиционеров: 1 – 1 шт.; 2 – 2 шт.; 3 – 3 шт.; 4 – 4 шт.; 5 – 5 шт.; 6 – 6 шт. 7 – 7 шт. 8 – 8 шт.;</p><div class="pageidnext">&nbsp;</div> [8] => <p id="isPasted">Modbus – интерфейс RS-485 MODBUS RTU<br><strong>[1]&nbsp;</strong>– тип протокола: 1 – RTU<br><strong>[2]</strong> – скорость передачи данных: 1 – 19200 кбит/с; 2 - 4800 кбит/с; &nbsp;3 – 9600 кбит/с<br><strong>[3]</strong> – направление движения: 0 – вперед; 1 – назад</p> ) ) [3] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">005</strong></div> [1] => <p><strong id="isPasted">01</strong></p> ) [fields] => Array ( [0] => <div>Тип датчика с абсолютной погрешностью 0,05 мм</div> [1] => <p>Тип датчика с абсолютной погрешностью 0,1 мм&nbsp;</p> ) ) [4] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">Вн [У] [П]</strong></p> ) [fields] => Array ( [0] => <div>Датчик общепромышленного исполнения</div> [1] => <p>Датчик взрывозащищенности исполнения<br id="isPasted">&nbsp;[П] – Прямой ввод; [У] – Угловой ввод</p> ) ) [5] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">Т1</strong></div> [1] => <p><strong id="isPasted">Т2</strong></p> [2] => <p><strong id="isPasted">Т3</strong></p> [3] => <p><strong id="isPasted">Т4</strong></p> ) [fields] => Array ( [0] => <div>-40…+85°С</div> [1] => <p>-40…+105°С</p> [2] => <p>-55…+85°С</p> [3] => <p>-55…+105°С</p> ) ) [6] => Array ( [block] => Array ( [0] => ) [fields] => Array ( [0] => <div><strong id="isPasted">25…6000</strong></div> ) [pagecheck] => 1 ) [7] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">НЗ0</strong></div> [1] => <p><strong id="isPasted">НЗ1</strong></p> [2] => <p><strong id="isPasted">НЗ2</strong></p> [3] => <p><strong id="isPasted">НЗ3</strong></p> [4] => <p><strong id="isPasted">НЗ4</strong></p> [5] => <p><strong id="isPasted">НЗ5</strong></p> [6] => <p><strong id="isPasted">НЗ6</strong></p> [7] => <p><strong id="isPasted">НЗ6_M4*</strong></p> [8] => <p><strong id="isPasted">НЗ7</strong></p> [9] => <p><strong id="isPasted">НЗ8</strong></p> [10] => <p><strong id="isPasted">НЗ9</strong></p> [11] => <p><strong id="isPasted">НЗ10</strong></p> [12] => <p><strong id="isPasted">НЗ11</strong></p> [13] => <p><strong id="isPasted">НЗ12</strong></p> [14] => <p><strong id="isPasted">НЗ13</strong></p> [15] => <p><strong id="isPasted">НЗ14</strong></p> [16] => <p><strong id="isPasted">НЗ15</strong></p> [17] => <p><strong id="isPasted">НЗ16</strong></p> [18] => <p><strong id="isPasted">НЗ17</strong></p> [19] => <p><strong id="isPasted">НЗ18</strong></p> [20] => <p><strong id="isPasted">НЗ19</strong></p> [21] => ) [fields] => Array ( [0] => <div>По согласованию на чертеже</div> [1] => <p>50,8/63,5 мм (стандарт MTS SENSORS)</p> [2] => <p>30/60 мм (стандарт BALLUFF)</p> [3] => <p>40/60 мм</p> [4] => <p>28/66 мм</p> [5] => <p>30/36,5 мм</p> [6] => <p>30/63,5 мм</p> [7] => <p>30/63,5 мм</p> [8] => <p>50/60 мм</p> [9] => <p>27,5/36 мм</p><div class="pageidnext">&nbsp;</div> [10] => <p>22/36,5 мм</p> [11] => <p>22/63,5 мм</p> [12] => <p>73/73 мм</p> [13] => <p>72,5/72,5 мм</p> [14] => <p>85/73 мм&nbsp;</p> [15] => <p>50,8/107 мм&nbsp;</p> [16] => <p>61/94 мм&nbsp;</p> [17] => <p>21/63,5 мм&nbsp;</p> [18] => <p>30.64 мм&nbsp;</p> [19] => <p>40/63,5 мм</p><div class="pageidnext">&nbsp;</div> [20] => <p>37,5/63,5 мм</p> [21] => <p>* Для СВ1 с резьбой М4 на конце ИЭ</p> ) ) [8] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">6Г</strong></p> [2] => <p><strong id="isPasted">06</strong></p> [3] => <p><strong id="isPasted">07</strong></p> [4] => <p><strong id="isPasted">08</strong></p> [5] => <p><strong id="isPasted">09</strong></p> [6] => <p><strong id="isPasted">10</strong></p> [7] => <p><strong id="isPasted">12</strong></p> [8] => <p><strong id="isPasted">14</strong></p> [9] => <p><strong id="isPasted">16</strong></p> ) [fields] => Array ( [0] => <div>Без стержня</div> [1] => <p>6 мм (гибкий ИЭ)</p> [2] => <p>6 мм</p> [3] => <p>7 мм</p> [4] => <p>8 мм</p> [5] => <p>9 мм</p> [6] => <p>10 мм</p> [7] => <p>12 мм</p><div class="pageidnext">&nbsp;</div> [8] => <p>14 мм</p> [9] => <p>16 мм</p> ) ) [9] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">М18</strong></p> [2] => <p><strong id="isPasted">UNF</strong></p> [3] => <p><strong id="isPasted">M20</strong></p> [4] => <p><strong id="isPasted">Ф</strong></p> [5] => <p><strong id="isPasted">Ф1</strong></p> [6] => <p><strong id="isPasted">В</strong></p> [7] => <p><strong id="isPasted">М18_В</strong></p> [8] => <p><strong id="isPasted">П</strong></p> [9] => <p><strong id="isPasted">Пу</strong></p> [10] => ) [fields] => Array ( [0] => <div>Присоединение бесфланцевое (для ТЛ-С2 тип 2)</div> [1] => <p>Присоединение с метрической резьбой М18х1,5</p> [2] => <p>Присоединение с резьбой 3/4”-16 UNF-3A</p> [3] => <p>Присоединение с метрической резьбой М20х1,5</p> [4] => <p>Фланцевое присоединение (нижнее уплотнение)</p> [5] => <p>Фланцевое присоединение (среднее уплотнение)</p> [6] => <p>Встраиваемое в гидроцилиндр</p> [7] => <p>Встраиваемое в гидроцилиндр с монтажной резьбой М18х1,5</p> [8] => <p>Профильное (с прямым выходом)</p><div class="pageidnext">&nbsp;</div> [9] => <p>Профильное с угловым выходом</p> [10] => <p>*Примечание - <strong id="isPasted">_У&nbsp;</strong>после основного обозначения присоединения обозначает <u>угловой выход</u> (пример – <strong>М18_У</strong>)</p> ) ) [10] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">МК1</strong></p> [2] => <p><strong id="isPasted">ПК1-11</strong></p> [3] => <p><strong id="isPasted">ПС1-2&nbsp;</strong></p> [4] => <p><strong id="isPasted">ПКВ1-2</strong></p> [5] => <p><strong id="isPasted">ПТ1-4</strong></p> [6] => <p><strong id="isPasted">ППР</strong></p> [7] => <p><strong id="isPasted">К; К1-3</strong></p> [8] => <p><strong id="isPasted">ПП1-8</strong></p> ) [fields] => Array ( [0] => <div>Магнитный позиционер отсутствует</div> [1] => <p>Магнит кольцевой (исполнение 1)</p> [2] => <p>Магнитные позиционеры кольцевые разных конструкций и исполнений</p> [3] => <p>Магнитные позиционеры секторные разных конструкций и исполнений</p> [4] => <p>Магнитные позиционеры квадратные разных конструкций и исполнений</p> [5] => <p>Магнитные позиционеры трапецеидальные разных конструкций и исполнений</p> [6] => <p>Магнитный позиционер прямоугольный</p> [7] => <p>Магнитные каретки разных конструкций и исполнений</p> [8] => <p>Магнитные позиционеры поплавковые разных конструкций и исполнений</p> ) ) [11] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">ТВ(L)</strong></div> [1] => <p><strong id="isPasted">ТВп(L1)_C70(L2)</strong></p> [2] => <p><strong id="isPasted">ТВпСВ(L)</strong></p> [3] => <p><strong id="isPasted">ТВп_2(L)</strong></p> [4] => <p><strong id="isPasted">С40(L)</strong></p> [5] => <p><strong id="isPasted">СШ40(L1)_(L2)</strong></p> [6] => <p><strong id="isPasted">СШ40/50(Lш1/Lш2)_(Lк1/Lк2)</strong></p> [7] => <p><strong id="isPasted">С40_2/С41(L)</strong></p> [8] => <p><strong id="isPasted">C50(L)</strong></p> [9] => <p><strong id="isPasted">C51(L)</strong></p> [10] => <p><strong id="isPasted">C50_2(L)</strong></p> [11] => <p><strong id="isPasted">C50_2/С41(L)</strong></p> [12] => <p><strong id="isPasted">C50_2/С30(L)</strong></p> [13] => <p><strong id="isPasted">СШ50(L1)_(L2)</strong></p> [14] => <p><strong id="isPasted">C60(L)</strong></p> [15] => <p><strong id="isPasted">C60_2(L)</strong></p> [16] => <p><strong id="isPasted">C70(L)</strong></p> [17] => <p><strong id="isPasted">C80(L)</strong></p> [18] => <p><strong id="isPasted">C81(L)</strong></p> [19] => <p><strong id="isPasted">KНн( )</strong></p> [20] => <p><strong id="isPasted">КНл( )</strong></p> [21] => <p><strong id="isPasted">КБн( )</strong></p> [22] => <p><strong id="isPasted">КМн15МР( )</strong></p> [23] => <p><strong id="isPasted">КМн20МР( )</strong></p> [24] => <p><strong id="isPasted">КМн12МР( )</strong></p> [25] => ) [fields] => Array ( [0] => <div>Ввод кабельный из нержавеющей стали для небронированного кабеля диаметром 8…13 мм; (L) – длина кабеля в метрах, кабель под клемму</div> [1] => <p>Ввод кабельный из нержавеющей стали для небронированного кабеля диаметром 8..13 мм; с разъемным соединителем на конце (L) – длина кабеля в метрах, кабель под пайку. Через _ &nbsp;тип разъема на конце кабеля, при наличии, (L2) – длина кабеля в метрах.&nbsp;</p> [2] => <p>Ввод кабельный из нержавеющей стали для небронированного кабеля диаметром 8..13 мм, (L) – длина кабеля в метрах, кабель под пайку, специальное исполнение кабельного ввода уменьшенного диаметра (Ø11) для исполнений ТЛ-СВ1/СВ2/СВ3</p> [3] => <p>Два кабельных ввода из нержавеющей стали для небронированного кабеля диаметром 8..13 мм, (L) – длина кабеля в метрах, кабель под пайку</p> [4] => <p>Разъемный соединитель М12 4-х контактный (IP69K), (L) – длина кабеля в метрах</p> [5] => <p>Разъемный соединитель фланцевый с шлейфом М12 4-х контактный, (L1) – длина шлейфа в метрах; Разъемный соединитель М12 4-х контактный (L2) – длина кабеля в метрах</p> [6] => <p id="isPasted">Разъемный соединитель фланцевый с шлейфом двойной М12&nbsp;</p><p>4-х контактный Lш1 – длина 1 шлейфа в метрах, Lш2 - длина 2 шлейфа в метрах; Lк1 – длина 1 кабеля в метрах, Lк2 – длина 2 кабеля в метрах.&nbsp;</p><p><strong>Применительно к исполнению ТЛ-СВ3 тип 1</strong></p> [7] => <p>Два разъемных соединителя М12 4-х контактных: розетка/розетка (IP69K), один разъемный соединитель М8 4-х контактный, (L) - длина кабеля в метрах. (применительно к интерфейсу ProfiBus-DP и CANBus)</p> [8] => <p>Разъемный соединитель М12 5-ти контактный (IP69K), (L) – длина кабеля в метрах (см. схему подключения конкретного исполнения)</p><div class="pageidnext">&nbsp;</div> [9] => <p>Разъемный соединитель М12 5-ти контактный (IP69K), (L) – длина кабеля в метрах (см. схему подключения конкретного исполнения)</p> [10] => <p>Два разъемных соединителя М12 5-ти контактных: вилка/розетка (IP69K), L - длина кабеля в метрах. (применительно к интерфейсу CANBus)</p> [11] => <p>Два разъемных соединителя М12 5-ти контактных: вилка/розетка (IP69K), один разъемный соединитель М8 4-х контактный, L - длина кабеля в метрах. (применительно к интерфейсу ProfiBus-DP и CANBus)</p> [12] => <p>Два разъемных соединителя М12 5-ти контактных: вилка/розетка (IP69K), один разъемный соединитель М8 3-х контактный, L - длина кабеля в метрах. (применительно к интерфейсу ProfiBus-DP)</p> [13] => <p>Разъемный соединитель фланцевый с шлейфом М12 5-ти контактный, (L1) – длина шлейфа в метрах; Разъемный соединитель М12 5-ти контактный (L2) – длина кабеля в метрах</p> [14] => <p>Разъемный соединитель M16 6-ти контактный (исполнение 1), L – длина кабеля в метрах</p> [15] => <p>Два разъемных соединителя M16 6-ти контактный: вилка/розетка (исполнение 1), L – длина кабеля в метрах. (применительно к интерфейсу ProfiBus-DP); M16 6-ти контактный: вилка/вилка (исполнение 2) (применительно к интерфейсу CANOpen)</p> [16] => <p>Разъемный соединитель M16 7-ми контактный (исполнение 1), L – длина кабеля в метрах</p><div class="pageidnext">&nbsp;</div> [17] => <p>разъемный соединитель M16 8-ми контактный (исполнение 1), L – длина кабеля в метрах</p> [18] => <p>разъемный соединитель M12 8-ми контактный (исполнение 1), L – длина кабеля в метрах</p> [19] => <p>ввод кабельный из нержавеющей стали для небронированного кабеля диаметром 8..13 мм (только для взрывозащищенного исполнения) (в ( ) – длина кабеля, м)</p> [20] => <p id="isPasted">ввод кабельный из латуни для небронированного кабеля диаметром 8…13 мм</p><p>(только для взрывозащищенного исполнения) (в [ ] – длина кабеля, м)</p> [21] => <p id="isPasted">ввод кабельный из нержавеющей стали для бронированного кабеля наружным</p><p>диаметром 10…19 мм и внутренним диаметром 6..14 мм (только для взрывозащищенного исполнения) (в [ ] – длина кабеля, м)</p> [22] => <p id="isPasted">ввод кабельный из нержавеющей стали для кабеля Ду = 13 в металлорукаве</p><p>диаметром15 мм (только для взрывозащищенного исполнения) (в [ ] – длина кабеля, м)</p> [23] => <p id="isPasted">ввод кабельный из нержавеющей стали для кабеля Ду = 13 в металлорукаве</p><p>диаметром 20 мм (только для взрывозащищенного исполнения) (в [ ] – длина кабеля, м)</p><div class="pageidnext">&nbsp;</div> [24] => <p id="isPasted">ввод кабельный из нержавеющей стали для кабеля Ду = 8 в металлорукаве</p><p>диаметром 12 мм (только для взрывозащищенного исполнения) (в [ ] – длина кабеля, м)</p> [25] => <p id="isPasted"><strong>Примечание</strong> – для датчика ТЛ-С2 тип 1 после основного обозначения электрического присоединения указывается тип сенсора и длина присоединительного кабеля в соответствии со следующим обозначением:&nbsp;</p><p><strong>_А</strong><strong>S</strong><strong>( )</strong>&nbsp; – сенсор с присоединением М18х1,5 SW46 с прямым кабельным вводом электронного блока ( ) &nbsp;– длина кабеля, м;<br><strong>_АВ( )</strong> – сенсор с присоединением М18х1,5 SW46 с боковым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;<br><strong>_АС( )</strong> – сенсор с присоединением М18х1,5 SW46 с прямым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;<br><strong>_В</strong><strong>S</strong><strong>( )</strong>&nbsp; – сенсор с присоединением М18х1,5 SW24 с прямым кабельным вводом электронного блока ( ) &nbsp;– длина кабеля, м;<br><strong>_ВВ( )</strong>&nbsp; &nbsp;– сенсор с присоединением М18х1,5 SW24 с боковым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;<br><strong>_ВС( )</strong> – сенсор с присоединением М18х1,5 SW24 с прямым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;<br><strong>_С</strong><strong>S</strong><strong>( )</strong>&nbsp; – сенсор с фланцевым присоединением с прямым кабельным вводом электронного блока ( ) &nbsp;– длина кабеля, м;<br><strong>_СВ( )</strong>&nbsp; &nbsp;– сенсор с фланцевым присоединением с боковым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;<br><strong>_СС( )</strong>&nbsp; &nbsp;– сенсор с фланцевым присоединением с прямым кабельным вводом и пластиковым коннектором электронного блока, ( ) &nbsp;– длина кабеля, м;</p><p>Пример обозначения: <strong>C</strong><strong>50_2/С41(5)_</strong><strong>ВС(1)</strong></p> ) [pagecheck] => 1 ) [12] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">ГП</strong></p> ) [fields] => Array ( [0] => <div>Отсутствие сертификата первичной государственной поверки</div> [1] => <p>Наличие сертификата первичной государственной поверки</p> ) ) [13] => Array ( [block] => Array ( [0] => <div><strong id="isPasted">0</strong></div> [1] => <p><strong id="isPasted">1</strong></p> [2] => <p><strong id="isPasted">2</strong></p> [3] => <p><strong id="isPasted">3</strong></p> [4] => <p><strong id="isPasted">4</strong></p> [5] => [6] => <div><img src="http://control.mail.com/scn/images/c10.png" style="height: 100px;" class="fr-fic fr-dib"></div> [7] => <div><img src="http://control.mail.com/scn/images/c11.png" style="height: 100px;" class="fr-fic fr-dib"></div> [8] => <div><img src="http://control.mail.com/scn/images/c12.png" style="height: 100px;" class="fr-fic fr-dib"></div> [9] => <div><img src="http://control.mail.com/scn/images/c13.png" style="height: 100px;" class="fr-fic fr-dib"></div> [10] => <div><img src="http://control.mail.com/scn/images/sf10.png" style="height: 100px;" class="fr-fic fr-dib"></div> [11] => <div><img src="http://control.mail.com/scn/images/sf11.png" style="height: 100px;" class="fr-fic fr-dib"></div> [12] => <div><img src="http://control.mail.com/scn/images/c20.png" style="height: 100px;" class="fr-fic fr-dib"></div> [13] => <div><img src="http://control.mail.com/scn/images/c21.png" style="height: 100px;" class="fr-fic fr-dib"></div> [14] => <div><img src="http://control.mail.com/scn/images/c22.png" style="height: 100px;" class="fr-fic fr-dib"></div> ) [fields] => Array ( [0] => <div>Стандартное</div> [1] => <p>Тип 1</p> [2] => <p>Тип 2</p> [3] => <p>Тип 3</p> [4] => <p>Тип 4</p> [5] => <p>*Примечание – обозначение 13 относится к исполнениям ТЛ-С1; ТЛ-С2 и ТЛ-СФ1</p> [6] => <p>Исполнение ТЛ-С1 <strong id="isPasted">стандартное</strong>, на конце обозначения (13 пункт) будет стоять <strong>0</strong></p> [7] => <p>Исполнение ТЛ-С1 <strong id="isPasted">тип 1</strong>, на конце обозначения будет стоять <strong>1</strong></p> [8] => <p>Исполнение ТЛ-С1 <strong id="isPasted">тип 2</strong>, на конце обозначения будет стоять 2</p><div class="pageidnext">&nbsp;</div> [9] => <p>Исполнение ТЛ-С1 <strong id="isPasted">тип 3</strong>, на конце обозначения будет стоять 3</p> [10] => <p>Исполнение ТЛ-СФ1 <strong id="isPasted">стандартное</strong>, на конце обозначения (13 пункт) будет стоять <strong>0</strong></p> [11] => <p>Исполнение ТЛ-СФ1 <strong id="isPasted">тип 1</strong>, на конце обозначения будет стоять <strong>1</strong></p> [12] => <p>Исполнение ТЛ-С2 <strong id="isPasted">стандартное</strong>, на конце обозначения (13 пункт) будет стоять <strong>0</strong></p> [13] => <p>Исполнение ТЛ-С2 <strong id="isPasted">тип 1</strong>, на конце обозначения будет стоять <strong>1</strong></p> [14] => <p>Исполнение ТЛ-С2 <strong id="isPasted">тип 2</strong>, на конце обозначения будет стоять <strong>2</strong></p> ) [pagecheck] => 1 ) )

Для обработки строк вида ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0, ТЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-ТВп(2)-0-1, и ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0 с учетом предоставленного массива параметров из базы данных, я разработаю PHP-решение, которое выполнит следующие задачи:

  1. Транслитерация: Заменит кириллические буквы, совпадающие с латиницей, на латинские, оставляя уникальные кириллические буквы (например, Т, Л, Ф) без изменений, и приведет строку к верхнему регистру.
  2. Разбор строки: Разделит строку на параметры по дефису (-).
  3. Сопоставление параметров: Проверит каждый параметр в предоставленном массиве из базы данных и вернет соответствующие описания.
  4. Обработка сложных параметров: Учтет параметры с индексами (например, А111, S1B1102) и специальные форматы (например, КБн(0), ТВп(2)).
  5. Формирование ответа: Вернет структурированный результат с описанием каждого параметра.

Предположения

  • Массив из базы данных ($dbArray) содержит параметры, организованные по группам (1–13), где block — это возможные значения параметров, а fields — их описания.
  • Каждая строка состоит из 13 параметров, разделенных дефисами, соответствующих группам 1–13 в массиве.
  • Для сложных параметров (например, А111, S1B1102) нужно извлечь базовую часть (например, А, S) и дополнительные индексы, чтобы найти соответствующее описание.
  • Параметры с круглыми скобками (например, КБн(0), ТВп(2)) включают длину кабеля, которая обрабатывается отдельно.
  • SQLite база данных не используется напрямую, так как предоставлен массив PHP, но я могу адаптировать код для работы с SQLite, если потребуется.

Реализация

1. Транслитерация

Функция для замены кириллических букв на латинские и приведения строки к верхнему регистру:

php
function transliterateToLatin($string) { $translitMap = [ 'А' => 'A', 'В' => 'B', 'Е' => 'E', 'К' => 'K', 'М' => 'M', 'Н' => 'H', 'О' => 'O', 'Р' => 'P', 'С' => 'C', 'Т' => 'T', 'У' => 'Y', 'Х' => 'X' ]; // Преобразуем в верхний регистр $string = mb_strtoupper($string, 'UTF-8'); // Заменяем совпадающие кириллические буквы на латинские foreach ($translitMap as $cyr => $lat) { $string = str_replace($cyr, $lat, $string); } return $string; }

2. Разбор и сопоставление параметров

Функция для обработки строки и поиска описаний в массиве:

php
function processString($inputString, $dbArray) { // Транслитерация строки $processedString = transliterateToLatin($inputString); // Разделение строки на параметры $params = explode('-', $processedString); // Проверка, что строка содержит 13 параметров if (count($params) !== 13) { return ['error' => 'Некорректное количество параметров в строке']; } $result = []; foreach ($params as $index => $param) { // Определяем группу параметров (1–13 соответствует индексам массива $dbArray) $group = $index + 1; // Для параметров с индексами (например, А111, S1B1102) извлекаем базовую часть $baseParam = preg_replace('/[0-9]+.*$/', '', $param); // Удаляем цифры и последующие символы $extraInfo = substr($param, strlen($baseParam)); // Остальная часть параметра // Специальная обработка для группы 11 (например, КБн(0), ТВп(2)) if ($group == 11) { preg_match('/([A-Za-zА-Яа-я0-9]+)(\(\d+\))?/', $param, $matches); $baseParam = $matches[1] ?? $param; $cableLength = isset($matches[2]) ? str_replace(['(', ')'], '', $matches[2]) : ''; } // Поиск описания в массиве $description = findParameterDescription($group, $baseParam, $extraInfo, $dbArray, $cableLength ?? ''); $result[$param] = $description; } return $result; } function findParameterDescription($group, $baseParam, $extraInfo, $dbArray, $cableLength = '') { if (!isset($dbArray[$group])) { return "Группа параметров $group не найдена"; } $blocks = $dbArray[$group]['block']; $fields = $dbArray[$group]['fields']; // Поиск параметра в block foreach ($blocks as $index => $block) { // Удаляем HTML-теги для сравнения $cleanBlock = strip_tags($block); // Проверяем, содержит ли block нужный параметр (учитываем сложные параметры) if (preg_match("/\b$baseParam\b/", $cleanBlock) || $cleanBlock === $baseParam) { $description = strip_tags($fields[$index]); // Дополнительная обработка для групп с индексами if ($group == 2 && $extraInfo) { // Разбиваем extraInfo на части (например, для А111 или S1B1102) $description .= parseExtraInfo($baseParam, $extraInfo, $fields[$index]); } // Добавляем информацию о длине кабеля для группы 11 if ($group == 11 && $cableLength !== '') { $description .= " (длина кабеля: $cableLength м)"; } return $description; } } return "Параметр $baseParam не найден в группе $group"; } function parseExtraInfo($baseParam, $extraInfo, $fieldDescription) { $extraDescription = ''; // Для группы 2 (например, А111, S1B1102) извлекаем индексы if ($baseParam === 'A' || $baseParam === 'A1') { preg_match_all('/\d+/', $extraInfo, $matches); $indices = $matches[0] ?? []; $descriptions = [ 1 => ['4…20 мА', '0…20 мА', '-20…+20 мА', '0…24 мА', '-10…+10 В', '0…+10 В', '0…+5 В', '-5…+5 В', '0,5…4,5 В', '0,25…4,75 В'], 2 => ['вперед', 'назад', 'вперед-назад'], 3 => ['положение', 'скорость', 'дельта расстояния'], 4 => ['Сохранить исходное значение', 'максимальное значение', 'минимальное значение'], 5 => ['Двухпроводная', '', '', 'Четырехпроводная'] ]; foreach ($indices as $pos => $index) { if (isset($descriptions[$pos + 1][$index])) { $extraDescription .= "; {$descriptions[$pos + 1][$index]}"; } } } elseif ($baseParam === 'S') { // Обработка для S (SSI интерфейс) preg_match('/(\d)([BG])(\d)(\d)([0-9]{2})/', $extraInfo, $matches); if ($matches) { $descriptions = [ 1 => ['25 бит', '24 бит', '26 бит'], 2 => ['B' => 'двоичная', 'G' => 'код Грея'], 3 => ['0,005 мм', '0,01 мм', '0,05 мм', '0,1 мм', '0,02 мм', '0,002 мм', '0,0001 мм', '0,001 мм', '0,0005 мм', '0,04 мм'], 4 => ['стандарт', '', '', '', '', '', '', 'шумоподавляющий фильтр (8 измерений)', '', 'без фильтра + подавление ошибок 10 циклов', 'шумоподавляющий фильтр (8 измерений) + подавление ошибок'] ]; $extraDescription .= "; длина массива: " . ($descriptions[1][$matches[1]] ?? ''); $extraDescription .= "; кодировка: " . ($descriptions[2][$matches[2]] ?? ''); $extraDescription .= "; разрешение: " . ($descriptions[3][$matches[3]] ?? ''); $extraDescription .= "; исполнение: " . ($descriptions[4][$matches[4]] ?? ''); $extraDescription .= "; опции: " . $matches[5]; } } return $extraDescription; }

3. Пример использования

Предположим, у вас есть массив $dbArray из предоставленных данных. Пример обработки трех строк:

php
// Загрузка массива (замените на ваш массив) $dbArray = /* Ваш массив из вопроса */; // Тестовые строки $strings = [ 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0', 'ТЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-ТВп(2)-0-1', 'ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0' ]; foreach ($strings as $string) { echo "Обработка строки: $string\n"; $result = processString($string, $dbArray); print_r($result); echo "\n"; }

Пример вывода для строки ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0

php
Array ( [ТЛ] => Тип устройства: ТЛ [CФ2] => Стержневая с фланцем типа 2 [A111] => Аналоговый выходной сигнал; 420 мА; назад; положение [005] => Тип датчика с абсолютной погрешностью 0,05 мм [Bн[Y]] => Датчик взрывозащищенного исполнения; Угловой ввод [T3] => -55…+85°С [80] => 80 мм (длина измерительного элемента) [H33] => Код настройки: Н33 [10] => 10 мм [Ф] => Фланцевое присоединение (нижнее уплотнение) [ПК1] => Магнитные позиционеры кольцевые разных конструкций и исполнений [КБн(0)] => Ввод кабельный из нержавеющей стали для бронированного кабеля наружным диаметром 1019 мм и внутренним диаметром 6..14 мм (только для взрывозащищенного исполнения) (длина кабеля: 0 м) [0] => Стандартное )

Объяснение

  1. Транслитерация:
    • СC, АA, ВB, НH, ТT, УY.
    • Уникальные кириллические буквы (Т, Л, Ф) остаются без изменений.
    • Строка преобразуется в верхний регистр: ТЛ-CФ2-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0.
  2. Разбор параметров:
    • Строка разбивается на 13 параметров по дефису.
    • Для каждого параметра определяется его базовая часть (например, А из А111, КБн из КБн(0)).
    • Для группы 2 (А111, S1B1102) извлекаются индексы, и добавляются соответствующие описания (например, 4…20 мА; назад; положение для А111).
  3. Сопоставление с массивом:
    • Для каждой группы (113) ищется соответствие в block и возвращается описание из fields.
    • Для группы 11 (например, КБн(0)) извлекается длина кабеля (0) и добавляется к описанию.
    • Если параметр не найден, возвращается сообщение об ошибке.
  4. Особенности:
    • Для параметра 80 (группа 6) предполагается, что это длина измерительного элемента (25…6000 мм), и возвращается как есть с добавлением единицы измерения.
    • Для параметра Н33 (группа 7) точное описание отсутствует в массиве, поэтому возвращается как "Код настройки: Н33".

Адаптация для SQLite

Если массив хранится в базе данных SQLite, можно модифицировать код для запросов к таблице. Пример структуры таблицы:

sql
CREATE TABLE parameters ( group_id INTEGER, param_value TEXT, description TEXT );

Модифицированная функция findParameterDescription:

php
function findParameterDescription($group, $baseParam, $extraInfo, $db, $cableLength = '') { $stmt = $db->prepare('SELECT description FROM parameters WHERE group_id = ? AND param_value = ?'); $stmt->execute([$group, $baseParam]); $description = $stmt->fetchColumn(); if ($description) { if ($group == 2 && $extraInfo) { $description .= parseExtraInfo($baseParam, $extraInfo, $description); } if ($group == 11 && $cableLength !== '') { $description .= " (длина кабеля: $cableLength м)"; } return $description; } return "Параметр $baseParam не найден в группе $group"; } function processString($inputString, $db) { $processedString = transliterateToLatin($inputString); $params = explode('-', $processedString); if (count($params) !== 13) { return ['error' => 'Некорректное количество параметров в строке']; } $result = []; foreach ($params as $index => $param) { $group = $index + 1; $baseParam = preg_replace('/[0-9]+.*$/', '', $param); $extraInfo = substr($param, strlen($baseParam)); if ($group == 11) { preg_match('/([A-Za-zА-Яа-я0-9]+)(\(\d+\))?/', $param, $matches); $baseParam = $matches[1] ?? $param; $cableLength = isset($matches[2]) ? str_replace(['(', ')'], '', $matches[2]) : ''; } else { $cableLength = ''; } $result[$param] = findParameterDescription($group, $baseParam, $extraInfo, $db, $cableLength); } return $result; } // Пример использования с SQLite $db = new PDO('sqlite:parameters.db'); foreach ($strings as $string) { echo "Обработка строки: $string\n"; $result = processString($string, $db); print_r($result); echo "\n"; }

Дополнительные замечания

  • Обработка сложных параметров: Для S1B1102 код разбирает индексы (1, B, 1, 1, 02) и сопоставляет их с описаниями (длина массива, кодировка, разрешение, исполнение, опции).
  • Ошибки: Если параметр (например, Н33, H311) не найден в массиве, возвращается его значение с префиксом "Код настройки".
  • Расширяемость: Код можно дополнить для обработки других сложных параметров или дополнительных условий, если уточните их.
  • Клиентская обработка: Если требуется предварительная транслитерация на клиенте, используйте JavaScript из предыдущего ответа.

Если у вас есть дополнительные уточнения (например, структура SQLite, конкретные условия для параметров вроде Н33 или H311), напишите, и я доработаю решение.

3,3s
Как Grok может помочь?