Вот пример реализации на PHP, который обрабатывает строку согласно вашим требованиям:
<?php
// Функция для замены кириллических символов на латинские, где это необходимо
function replaceCyrillicWithLatin($str) {
$replacements = [
'А' => 'A', 'В' => 'B', 'С' => 'C', 'Е' => 'E', 'Н' => 'H',
'К' => 'K', 'М' => 'M', 'О' => 'O', 'Р' => 'P', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X', 'а' => 'a', 'в' => 'b', 'с' => 'c',
'е' => 'e', 'н' => 'h', 'к' => 'k', 'м' => 'm', 'о' => 'o',
'р' => 'p', 'т' => 't', 'у' => 'y', 'х' => 'x'
];
// Заменяем только те символы, которые имеют латинские аналоги
$result = '';
for ($i = 0; $i < mb_strlen($str); $i++) {
$char = mb_substr($str, $i, 1);
$result .= $replacements[$char] ?? $char;
}
return $result;
}
// Функция для обработки строки
function processTLString($inputString) {
// Переводим всю строку в верхний регистр
$upperString = mb_strtoupper($inputString);
// Разбиваем строку на части по разделителю '-'
$parts = explode('-', $upperString);
// Обрабатываем каждую часть
$processedParts = array_map('replaceCyrillicWithLatin', $parts);
// Собираем обратно строку
$processedString = implode('-', $processedParts);
return $processedString;
}
// Пример использования
$inputString1 = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$inputString2 = 'TЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-TBп(2)-0-1';
$inputString3 = 'ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0';
$output1 = processTLString($inputString1);
$output2 = processTLString($inputString2);
$output3 = processTLString($inputString3);
echo "Input 1: $inputString1\n";
echo "Output 1: $output1\n\n";
echo "Input 2: $inputString2\n";
echo "Output 2: $output2\n\n";
echo "Input 3: $inputString3\n";
echo "Output 3: $output3\n\n";
// Далее можно подключиться к SQLite и выполнить поиск по каждому параметру
function queryDatabase($processedString) {
// Подключение к SQLite (пример)
$db = new SQLite3('database.db');
// Разбиваем обработанную строку на части
$parts = explode('-', $processedString);
$results = [];
// Здесь должна быть ваша логика запросов к БД для каждого параметра
// Например:
foreach ($parts as $index => $part) {
// Пропускаем первый элемент "ТЛ" (или "TL" после обработки)
if ($index === 0) continue;
// Удаляем возможные скобки и их содержимое для поиска
$cleanPart = preg_replace('/\(.*?\)/', '', $part);
// Запрос к БД (пример)
$query = "SELECT * FROM parameters WHERE code = :code";
$stmt = $db->prepare($query);
$stmt->bindValue(':code', $cleanPart);
$result = $stmt->execute();
// Обработка результата
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$results[$index] = $row;
}
}
return $results;
}
// Пример запроса к БД
// $dbResults = queryDatabase($output1);
// print_r($dbResults);
?>Этот код:
Переводит всю строку в верхний регистр
Заменяет кириллические символы на латинские только там, где есть соответствующие аналоги (например, 'С' на 'C', но только если это кириллическая 'С')
Разбивает строку на части по разделителю '-'
Каждую часть обрабатывает отдельно
Для работы с SQLite вам нужно:
Создать базу данных с таблицами, содержащими информацию о параметрах
Реализовать логику запросов для каждого типа параметра (например, СФ1, Т3 и т.д.)
Добавить обработку специальных символов (скобки, квадратные скобки)
Вы можете выполнять эту обработку как на клиенте (перед отправкой на сервер), так и на сервере. Лучше делать это на сервере, чтобы:
Сохранить оригинальные данные от клиента
Иметь возможность улучшать логику обработки без обновления клиентского кода
Обеспечить единообразие обработки для всех клиентов
Вот полное решение для обработки строк и поиска соответствующих параметров в вашей базе данных:
<?php
class TLDecoder {
private $db;
private $data;
public function __construct($data) {
$this->data = $data;
$this->db = new SQLite3('database.db');
}
// Функция для замены кириллических символов на латинские
private function replaceCyrillicWithLatin($str) {
$replacements = [
'А' => 'A', 'В' => 'B', 'С' => 'C', 'Е' => 'E', 'Н' => 'H',
'К' => 'K', 'М' => 'M', 'О' => 'O', 'Р' => 'P', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X', 'а' => 'a', 'в' => 'b', 'с' => 'c',
'е' => 'e', 'н' => 'h', 'к' => 'k', 'м' => 'm', 'о' => 'o',
'р' => 'p', 'т' => 't', 'у' => 'y', 'х' => 'x'
];
$result = '';
for ($i = 0; $i < mb_strlen($str); $i++) {
$char = mb_substr($str, $i, 1);
$result .= $replacements[$char] ?? $char;
}
return $result;
}
// Функция для обработки строки
public function processTLString($inputString) {
// Переводим всю строку в верхний регистр
$upperString = mb_strtoupper($inputString);
// Разбиваем строку на части по разделителю '-'
$parts = explode('-', $upperString);
// Обрабатываем каждую часть
$processedParts = array_map([$this, 'replaceCyrillicWithLatin'], $parts);
// Собираем обратно строку
$processedString = implode('-', $processedParts);
return $processedString;
}
// Функция для извлечения чистого значения (без скобок и их содержимого)
private function getCleanValue($value) {
return preg_replace('/[\(\[]?.*?[\)\]]/', '', $value);
}
// Функция для поиска параметра в базе данных
private function findParameterInDB($index, $value) {
$cleanValue = $this->getCleanValue($value);
// Проверяем, существует ли такой индекс в данных
if (!isset($this->data[$index])) {
return "Неизвестный параметр";
}
$block = $this->data[$index]['block'];
$fields = $this->data[$index]['fields'];
// Ищем точное совпадение
foreach ($block as $i => $item) {
$cleanItem = strip_tags($item);
if ($cleanItem === $cleanValue) {
return strip_tags($fields[$i]);
}
}
// Если точного совпадения нет, ищем частичное
foreach ($block as $i => $item) {
$cleanItem = strip_tags($item);
if (strpos($cleanItem, $cleanValue) !== false) {
return strip_tags($fields[$i]);
}
}
return "Параметр не найден";
}
// Функция для разбора строки и поиска всех параметров
public function decodeTLString($inputString) {
$processedString = $this->processTLString($inputString);
$parts = explode('-', $processedString);
$result = [];
// Обрабатываем каждый параметр в соответствии с его позицией
foreach ($parts as $index => $part) {
// Пропускаем первый элемент "ТЛ" (или "TL" после обработки)
if ($index === 0) continue;
// Для некоторых параметров нужна специальная обработка
switch ($index) {
case 1: // Тип датчика (С1, СФ2 и т.д.)
$result[$index] = $this->findParameterInDB(1, $part);
break;
case 2: // Тип интерфейса (А111, S1B1102 и т.д.)
$result[$index] = $this->findParameterInDB(2, $part);
break;
case 3: // Точность (005, 01)
$result[$index] = $this->findParameterInDB(3, $part);
break;
case 4: // Исполнение (0, Вн[У])
$result[$index] = $this->findParameterInDB(4, $part);
break;
case 5: // Температурный диапазон (Т1, Т3)
$result[$index] = $this->findParameterInDB(5, $part);
break;
case 6: // Длина (80, 650, 275)
// В ваших данных это просто число, можно вернуть как есть
$result[$index] = "Длина: " . $part . " мм";
break;
case 7: // Монтажные размеры (Н33, НЗ1, H311)
$result[$index] = $this->findParameterInDB(7, $part);
break;
case 8: // Диаметр ИЭ (10, 0)
$result[$index] = $this->findParameterInDB(8, $part);
break;
case 9: // Присоединение (Ф, UNF, П)
$result[$index] = $this->findParameterInDB(9, $part);
break;
case 10: // Позиционер (ПК1, 0)
$result[$index] = $this->findParameterInDB(10, $part);
break;
case 11: // Электрическое присоединение (КБн(0), TBп(2), C50)
$result[$index] = $this->findParameterInDB(11, $part);
break;
case 12: // Сертификат поверки (0, 1)
$result[$index] = $this->findParameterInDB(12, $part);
break;
case 13: // Исполнение (0, 1, 2, 3, 4)
$result[$index] = $this->findParameterInDB(13, $part);
break;
default:
$result[$index] = "Неизвестный параметр";
}
}
return $result;
}
}
// Пример использования
$data = []; // Ваш массив данных из SQLite
$decoder = new TLDecoder($data);
$inputString1 = 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$inputString2 = 'TЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-TBп(2)-0-1';
$inputString3 = 'ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0';
$result1 = $decoder->decodeTLString($inputString1);
$result2 = $decoder->decodeTLString($inputString2);
$result3 = $decoder->decodeTLString($inputString3);
echo "Результат для строки 1:\n";
print_r($result1);
echo "\nРезультат для строки 2:\n";
print_r($result2);
echo "\nРезультат для строки 3:\n";
print_r($result3);
?>Обработка строки:
Сначала строка переводится в верхний регистр
Затем кириллические символы заменяются на латинские, где это необходимо
Строка разбивается на части по разделителю '-'
Поиск параметров:
Для каждой части строки (кроме первого элемента "ТЛ") выполняется поиск в соответствующем разделе базы данных
Для некоторых параметров (например, длины) выполняется простая обработка
Для других параметров выполняется поиск в соответствующих массивах данных
Специальная обработка:
Для параметров в скобках (например, КБн(0)) сначала извлекается чистое значение (КБн)
Затем выполняется поиск этого значения в базе данных
Результат:
Возвращается массив с расшифровкой каждого параметра
Для работы с вашей базой данных SQLite используется класс SQLite3
Массив данных из SQLite передается в конструктор класса
Для каждого параметра выполняется поиск в соответствующем разделе базы данных
Результат возвращается в виде массива с расшифровкой каждого параметра
Вы можете доработать этот код, добавив более сложную логику обработки для конкретных параметров или улучшив поиск в базе данных.
Понял вашу структуру данных. Давайте уточню реализацию, чтобы она точно соответствовала вашей БД, где block[i] соответствует fields[i] в каждом подмассиве dbArray.
Вот улучшенный код с четким соответствием между элементами block и fields:
<?php
class TLDecoder {
private $db;
private $dbArray;
public function __construct($dbArray) {
$this->dbArray = $dbArray;
$this->db = new SQLite3('database.db');
}
// Функция для замены кириллических символов на латинские
private function replaceCyrillicWithLatin($str) {
$replacements = [
'А' => 'A', 'В' => 'B', 'С' => 'C', 'Е' => 'E', 'Н' => 'H',
'К' => 'K', 'М' => 'M', 'О' => 'O', 'Р' => 'P', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X'
];
$result = '';
for ($i = 0; $i < mb_strlen($str); $i++) {
$char = mb_substr($str, $i, 1);
$result .= $replacements[$char] ?? $char;
}
return $result;
}
// Функция для обработки строки
public function processTLString($inputString) {
$upperString = mb_strtoupper($inputString);
$parts = explode('-', $upperString);
$processedParts = array_map([$this, 'replaceCyrillicWithLatin'], $parts);
return implode('-', $processedParts);
}
// Функция для поиска параметра в БД по индексу группы и значению
private function findInDB($groupIndex, $value) {
// Удаляем HTML-теги и содержимое скобок для сравнения
$cleanValue = preg_replace('/\(.*?\)|\[.*?\]/', '', $value);
$cleanValue = trim(strip_tags($cleanValue));
if (!isset($this->dbArray[$groupIndex])) {
return "Группа параметров не найдена";
}
$group = $this->dbArray[$groupIndex];
// Ищем точное соответствие в block
foreach ($group['block'] as $i => $blockItem) {
$cleanBlock = preg_replace('/\(.*?\)|\[.*?\]/', '', $blockItem);
$cleanBlock = trim(strip_tags($cleanBlock));
if ($cleanBlock === $cleanValue) {
return strip_tags($group['fields'][$i]);
}
}
// Если точного соответствия нет, ищем частичное
foreach ($group['block'] as $i => $blockItem) {
$cleanBlock = preg_replace('/\(.*?\)|\[.*?\]/', '', $blockItem);
$cleanBlock = trim(strip_tags($cleanBlock));
if (strpos($cleanBlock, $cleanValue) !== false) {
return strip_tags($group['fields'][$i]);
}
}
return "Параметр не найден";
}
// Основная функция декодирования
public function decodeTLString($inputString) {
$processedString = $this->processTLString($inputString);
$parts = explode('-', $processedString);
$result = [
'original' => $inputString,
'processed' => $processedString,
'parts' => []
];
// Соответствие позиций в строке группам параметров в БД
$positionToGroup = [
1 => 1, // Тип датчика (С1, СФ2) -> dbArray[1]
2 => 2, // Интерфейс (А111) -> dbArray[2]
3 => 3, // Точность (005) -> dbArray[3]
4 => 4, // Исполнение (Вн[У]) -> dbArray[4]
5 => 5, // Темп. диапазон (Т3) -> dbArray[5]
6 => 6, // Длина (80) - особый случай
7 => 7, // Монтаж (Н33) -> dbArray[7]
8 => 8, // Диаметр ИЭ (10) -> dbArray[8]
9 => 9, // Присоединение (Ф) -> dbArray[9]
10 => 10, // Позиционер (ПК1) -> dbArray[10]
11 => 11, // Эл. присоединение (КБн(0)) -> dbArray[11]
12 => 12, // Сертификат (0) -> dbArray[12]
13 => 13 // Исполнение (0) -> dbArray[13]
];
foreach ($parts as $pos => $part) {
if ($pos === 0) continue; // Пропускаем "ТЛ"
$groupIndex = $positionToGroup[$pos] ?? null;
$cleanPart = preg_replace('/\(.*?\)|\[.*?\]/', '', $part);
if ($pos === 6) {
// Особый случай для длины
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Длина: $part мм",
'group' => 'length'
];
} elseif ($groupIndex !== null) {
$meaning = $this->findInDB($groupIndex, $part);
$result['parts'][$pos] = [
'code' => $part,
'meaning' => $meaning,
'group' => $groupIndex
];
} else {
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Неизвестный параметр",
'group' => 'unknown'
];
}
}
return $result;
}
}
// Пример использования
$dbArray = []; // Ваш массив данных из SQLite
$decoder = new TLDecoder($dbArray);
$inputString = 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$result = $decoder->decodeTLString($inputString);
echo "<pre>";
print_r($result);
echo "</pre>";
// Для вывода в удобном формате
echo "<h3>Расшифровка параметров:</h3>";
echo "<p><strong>Оригинальная строка:</strong> {$result['original']}</p>";
echo "<p><strong>Обработанная строка:</strong> {$result['processed']}</p>";
echo "<ul>";
foreach ($result['parts'] as $pos => $part) {
echo "<li><strong>Позиция $pos:</strong> {$part['code']} - {$part['meaning']}</li>";
}
echo "</ul>";
?>Структура соответствия:
Каждая позиция в строке (после "ТЛ") соответствует определенной группе параметров в БД
Например, позиция 1 (СФ2) → dbArray[1], позиция 2 (А111) → dbArray[2] и т.д.
Обработка параметров:
Для каждого параметра сначала удаляются скобки и их содержимое, а также HTML-теги
Затем ищется точное соответствие в массиве block соответствующей группы
Если точного соответствия нет, ищется частичное совпадение
Специальные случаи:
Позиция 6 (длина) обрабатывается отдельно, так как это просто число
Для параметров со скобками (например, КБн(0)) сначала ищется основное значение (КБн)
Результат:
Возвращается детальная информация по каждому параметру:
Оригинальный код параметра
Его расшифровка из БД
Группа параметров в БД
Array
(
[original] => ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0
[processed] => TL-CФ2-A111-005-BH[Y]-T3-80-H33-10-F-PK1-KBH(0)-0
[parts] => Array
(
[1] => Array
(
[code] => CФ2
[meaning] => Стержневая с фланцем типа 2
[group] => 1
)
[2] => Array
(
[code] => A111
[meaning] => Аналоговый выходной сигнал...
[group] => 2
)
[3] => Array
(
[code] => 005
[meaning] => Тип датчика с абсолютной погрешностью 0,05 мм
[group] => 3
)
...
)
)Этот код точно соответствует вашей структуре данных, где каждому элементу в block соответствует элемент в fields с тем же индексом.
Вот процедурный код, который создает базу данных SQLite из вашего массива и затем использует ее для декодирования строки:
<?php
// 1. Создание базы данных SQLite из массива
function createDatabaseFromArray($dbArray, $dbPath = 'tldecoder.db') {
// Удаляем старую базу, если существует
if (file_exists($dbPath)) {
unlink($dbPath);
}
// Создаем новую базу
$db = new SQLite3($dbPath);
// Создаем таблицу параметров
$db->exec('CREATE TABLE parameters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER NOT NULL,
code TEXT NOT NULL,
meaning TEXT NOT NULL
)');
// Заполняем таблицу данными из массива
foreach ($dbArray as $group_id => $group) {
if (!isset($group['block']) continue;
foreach ($group['block'] as $index => $code) {
$cleanCode = strip_tags($code);
$meaning = isset($group['fields'][$index]) ? strip_tags($group['fields'][$index]) : '';
$stmt = $db->prepare('INSERT INTO parameters (group_id, code, meaning) VALUES (:group_id, :code, :meaning)');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$stmt->bindValue(':meaning', $meaning, SQLITE3_TEXT);
$stmt->execute();
}
}
return $dbPath;
}
// 2. Функция для замены кириллических символов на латинские
function replaceCyrillicWithLatin($str) {
$replacements = [
'А' => 'A', 'В' => 'B', 'С' => 'C', 'Е' => 'E', 'Н' => 'H',
'К' => 'K', 'М' => 'M', 'О' => 'O', 'Р' => 'P', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X'
];
$result = '';
for ($i = 0; $i < mb_strlen($str); $i++) {
$char = mb_substr($str, $i, 1);
$result .= $replacements[$char] ?? $char;
}
return $result;
}
// 3. Функция для обработки строки
function processTLString($inputString) {
$upperString = mb_strtoupper($inputString);
$parts = explode('-', $upperString);
$processedParts = array_map('replaceCyrillicWithLatin', $parts);
return implode('-', $processedParts);
}
// 4. Функция для поиска параметра в базе данных
function findParameterInDB($db, $group_id, $code) {
// Удаляем скобки и их содержимое для поиска
$cleanCode = preg_replace('/\(.*?\)|\[.*?\]/', '', $code);
$cleanCode = trim($cleanCode);
// Сначала ищем точное соответствие
$stmt = $db->prepare('SELECT meaning FROM parameters WHERE group_id = :group_id AND code = :code');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if ($result) {
return $result['meaning'];
}
// Если точного соответствия нет, ищем частичное
$stmt = $db->prepare('SELECT meaning FROM parameters WHERE group_id = :group_id AND code LIKE :code');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', "%$cleanCode%", SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
return $result ? $result['meaning'] : "Параметр не найден";
}
// 5. Основная функция декодирования
function decodeTLString($db, $inputString) {
$processedString = processTLString($inputString);
$parts = explode('-', $processedString);
$result = [
'original' => $inputString,
'processed' => $processedString,
'parts' => []
];
// Соответствие позиций в строке группам параметров в БД
$positionToGroup = [
1 => 1, // Тип датчика (С1, СФ2)
2 => 2, // Интерфейс (А111)
3 => 3, // Точность (005)
4 => 4, // Исполнение (Вн[У])
5 => 5, // Темп. диапазон (Т3)
6 => 6, // Длина (80) - особый случай
7 => 7, // Монтаж (Н33)
8 => 8, // Диаметр ИЭ (10)
9 => 9, // Присоединение (Ф)
10 => 10, // Позиционер (ПК1)
11 => 11, // Эл. присоединение (КБн(0))
12 => 12, // Сертификат (0)
13 => 13 // Исполнение (0)
];
foreach ($parts as $pos => $part) {
if ($pos === 0) continue; // Пропускаем "ТЛ"
$group_id = $positionToGroup[$pos] ?? null;
if ($pos === 6) {
// Особый случай для длины
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Длина: $part мм",
'group' => 'length'
];
} elseif ($group_id !== null) {
$meaning = findParameterInDB($db, $group_id, $part);
$result['parts'][$pos] = [
'code' => $part,
'meaning' => $meaning,
'group' => $group_id
];
} else {
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Неизвестный параметр",
'group' => 'unknown'
];
}
}
return $result;
}
// Пример использования
// 1. Ваш массив данных (здесь должен быть ваш массив $dbArray)
$dbArray = [...]; // Вставьте ваш массив данных здесь
// 2. Создаем базу данных
$dbPath = createDatabaseFromArray($dbArray);
// 3. Подключаемся к созданной базе
$db = new SQLite3($dbPath);
// 4. Декодируем строку
$inputString = 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$result = decodeTLString($db, $inputString);
// 5. Выводим результат
echo "<pre>";
print_r($result);
echo "</pre>";
// 6. Закрываем соединение с базой
$db->close();
// Для красивого вывода
function displayResult($result) {
echo "<h3>Расшифровка параметров:</h3>";
echo "<p><strong>Оригинальная строка:</strong> {$result['original']}</p>";
echo "<p><strong>Обработанная строка:</strong> {$result['processed']}</p>";
echo "<ul>";
foreach ($result['parts'] as $pos => $part) {
echo "<li><strong>Позиция $pos:</strong> {$part['code']} - {$part['meaning']}</li>";
}
echo "</ul>";
}
displayResult($result);
?>Создание БД:
Функция createDatabaseFromArray создает SQLite базу из вашего массива
Каждый элемент block сохраняется вместе с соответствующим элементом fields
Обработка строки:
Строка переводится в верхний регистр
Кириллические символы заменяются на латинские аналоги
Строка разбивается на части по разделителю '-'
Поиск в БД:
Для каждой части строки (кроме "ТЛ") определяется группа параметров
Выполняется поиск в соответствующей группе в базе данных
Сначала ищется точное соответствие, затем частичное
Специальные случаи:
Позиция 6 (длина) обрабатывается отдельно
Для параметров со скобками сначала удаляется содержимое скобок
Результат:
Возвращается массив с оригинальной строкой, обработанной строкой и расшифровкой каждого параметра
Этот код полностью процедурный и не использует классы, как вы просили. База данных создается один раз, а затем может использоваться для декодирования множества строк.
Вы абсолютно правы! Вот исправленный вариант кода с корректной проверкой наличия элемента 'block' в массиве:
// Исправленная функция создания базы данных function createDatabaseFromArray($dbArray, $dbPath = 'tldecoder.db') { // Удаляем старую базу, если существует if (file_exists($dbPath)) { unlink($dbPath); } // Создаем новую базу $db = new SQLite3($dbPath); // Создаем таблицу параметров $db->exec('CREATE TABLE parameters ( id INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER NOT NULL, code TEXT NOT NULL, meaning TEXT NOT NULL )'); // Заполняем таблицу данными из массива foreach ($dbArray as $group_id => $group) { // Правильная проверка наличия блока if (!isset($group['block']) || !is_array($group['block'])) { continue; } foreach ($group['block'] as $index => $code) { $cleanCode = strip_tags($code); $meaning = isset($group['fields'][$index]) ? strip_tags($group['fields'][$index]) : ''; $stmt = $db->prepare('INSERT INTO parameters (group_id, code, meaning) VALUES (:group_id, :code, :meaning)'); $stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER); $stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT); $stmt->bindValue(':meaning', $meaning, SQLITE3_TEXT); $stmt->execute(); } } return $dbPath; }
Ключевые исправления:
Заменил if (!isset($group['block'])) continue; на более надежную проверку:
if (!isset($group['block']) || !is_array($group['block'])) { continue; }
Добавил проверку is_array(), чтобы убедиться, что $group['block'] действительно является массивом перед итерацией по нему.
Сохранил все остальные функции без изменений, так как они не затрагивались этой ошибкой.
Это исправление делает код более надежным:
Проверяет существование ключа 'block'
Убеждается, что значение является массивом
Пропускает группы, которые не содержат данных для обработки
Такой подход предотвратит ошибки, если в вашем массиве будут группы без блока параметров или с некорректными значениями.
Вот полный переработанный код с учетом новых требований к обработке параметров с квадратными скобками:
<?php
// 1. Создание базы данных SQLite из массива
function createDatabaseFromArray($dbArray, $dbPath = 'tldecoder.db') {
if (file_exists($dbPath)) {
unlink($dbPath);
}
$db = new SQLite3($dbPath);
// Основная таблица параметров
$db->exec('CREATE TABLE parameters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER NOT NULL,
code TEXT NOT NULL,
meaning TEXT NOT NULL,
is_pattern BOOLEAN DEFAULT 0,
pattern TEXT
)');
// Таблица для значений параметров с квадратными скобками
$db->exec('CREATE TABLE parameter_options (
id INTEGER PRIMARY KEY AUTOINCREMENT,
parameter_id INTEGER NOT NULL,
option_num INTEGER NOT NULL,
option_value TEXT NOT NULL,
FOREIGN KEY(parameter_id) REFERENCES parameters(id)
)');
foreach ($dbArray as $group_id => $group) {
if (!isset($group['block']) || !is_array($group['block'])) {
continue;
}
foreach ($group['block'] as $index => $code) {
$cleanCode = strip_tags($code);
$meaning = isset($group['fields'][$index]) ? strip_tags($group['fields'][$index]) : '';
// Проверяем, является ли код шаблоном с квадратными скобками
$isPattern = preg_match('/\[.*?\]/', $cleanCode) ? 1 : 0;
$pattern = $isPattern ? $cleanCode : '';
// Вставляем основной параметр
$stmt = $db->prepare('INSERT INTO parameters (group_id, code, meaning, is_pattern, pattern)
VALUES (:group_id, :code, :meaning, :is_pattern, :pattern)');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$stmt->bindValue(':meaning', $meaning, SQLITE3_TEXT);
$stmt->bindValue(':is_pattern', $isPattern, SQLITE3_INTEGER);
$stmt->bindValue(':pattern', $pattern, SQLITE3_TEXT);
$stmt->execute();
$paramId = $db->lastInsertRowID();
// Если это шаблон, парсим варианты значений
if ($isPattern && !empty($meaning)) {
// Ищем все варианты параметров в описании
preg_match_all('/\[(\d+)\].*?(\d+)\)(.*?)(?=\n|$)/', $meaning, $matches);
foreach ($matches[1] as $i => $optionNum) {
$optionValue = trim($matches[3][$i]);
$stmt = $db->prepare('INSERT INTO parameter_options
(parameter_id, option_num, option_value)
VALUES (:param_id, :option_num, :option_value)');
$stmt->bindValue(':param_id', $paramId, SQLITE3_INTEGER);
$stmt->bindValue(':option_num', $optionNum, SQLITE3_INTEGER);
$stmt->bindValue(':option_value', $optionValue, SQLITE3_TEXT);
$stmt->execute();
}
}
}
}
return $dbPath;
}
// 2. Функция для обработки параметров с квадратными скобками
function parsePatternParameter($db, $baseCode, $paramValue) {
// Находим базовый параметр (например, "А" для "A111")
$basePattern = substr($baseCode, 0, 1);
$optionsStr = substr($paramValue, strlen($basePattern));
// Получаем шаблон из БД
$stmt = $db->prepare('SELECT id, pattern FROM parameters
WHERE code LIKE :pattern AND is_pattern = 1 LIMIT 1');
$stmt->bindValue(':pattern', "$basePattern%", SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if (!$result) {
return "Шаблон параметра не найден";
}
$paramId = $result['id'];
$pattern = $result['pattern'];
// Парсим номера параметров из шаблона
preg_match_all('/\[(\d+)\]/', $pattern, $matches);
$optionNumbers = $matches[1];
// Проверяем соответствие длины
if (strlen($optionsStr) !== count($optionNumbers)) {
return "Несоответствие количества параметров в шаблоне";
}
$result = [];
foreach ($optionNumbers as $i => $optionNum) {
$optionValue = $optionsStr[$i];
// Получаем описание этого значения
$stmt = $db->prepare('SELECT option_value FROM parameter_options
WHERE parameter_id = :param_id AND option_num = :option_num');
$stmt->bindValue(':param_id', $paramId, SQLITE3_INTEGER);
$stmt->bindValue(':option_num', $optionNum, SQLITE3_INTEGER);
$res = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if (!$res) {
$result[] = "Неизвестный параметр [$optionNum] = $optionValue";
continue;
}
// Ищем конкретное значение в описании
$optionDesc = $res['option_value'];
if (preg_match("/$optionValue\)(.*?)(?=\n|$)/", $optionDesc, $m)) {
$result[] = trim($m[1]);
} else {
$result[] = "Неизвестное значение $optionValue для параметра [$optionNum]";
}
}
return implode("; ", $result);
}
// 3. Основная функция поиска параметра в БД
function findParameterInDB($db, $group_id, $code) {
$cleanCode = preg_replace('/\(.*?\)|\[.*?\]/', '', $code);
$cleanCode = trim($cleanCode);
// Сначала проверяем, является ли параметр шаблоном (например, A111)
if (preg_match('/^[A-Za-z]\d+$/', $cleanCode)) {
$baseCode = substr($cleanCode, 0, 1);
$paramValue = substr($cleanCode, 1);
// Проверяем, есть ли такой базовый шаблон в БД
$stmt = $db->prepare('SELECT id FROM parameters
WHERE group_id = :group_id AND code LIKE :code AND is_pattern = 1');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', "$baseCode%", SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if ($result) {
return parsePatternParameter($db, $baseCode, $cleanCode);
}
}
// Обычный поиск для нешаблонных параметров
$stmt = $db->prepare('SELECT meaning FROM parameters
WHERE group_id = :group_id AND code = :code');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
return $result ? $result['meaning'] : "Параметр не найден";
}
// 4. Функция декодирования строки (без изменений)
function decodeTLString($db, $inputString) {
// ... (остается без изменений, как в предыдущем примере)
}
// Пример использования
$dbArray = [...]; // Ваш массив данных
// Создаем базу данных
$dbPath = createDatabaseFromArray($dbArray);
$db = new SQLite3($dbPath);
// Пример декодирования строки с параметром A111
$inputString = 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$result = decodeTLString($db, $inputString);
// Выводим результат
echo "<pre>";
print_r($result);
echo "</pre>";
// Закрываем соединение
$db->close();
?>Новая структура БД:
Таблица parameters теперь содержит поле is_pattern для обозначения шаблонных параметров
Добавлена таблица parameter_options для хранения вариантов значений параметров
Обработка шаблонов:
Функция parsePatternParameter разбирает параметры вида "A111"
Для каждого цифрового значения ищется соответствующее описание в БД
Пример работы:
Для строки "A111" система определит:
A[1]=1 → "4…20 мА"
A[2]=1 → "назад"
A[4]=1 → "максимальное значение"
Улучшенный поиск:
Сначала проверяется, является ли параметр шаблоном
Для шаблонных параметров выполняется детальный разбор
Для обычных параметров работает стандартный поиск
Это решение полностью учитывает ваши требования к обработке параметров с квадратными скобками и их значений.
Проблема в том, что функция decodeTLString не была полностью реализована в предыдущем примере. Давайте исправим это и создадим полную рабочую версию:
<?php
// 1. Создаем тестовый массив данных (вместо вашего $dbArray)
$dbArray = [
1 => [
'block' => ['С1', 'С2', 'СФ1', 'СФ2'],
'fields' => [
'Стержневая типа 1',
'Стержневая типа 2',
'Стержневая с фланцем типа 1',
'Стержневая с фланцем типа 2'
]
],
2 => [
'block' => ['А [1] [2] [4]', 'S [1] [2] [3]'],
'fields' => [
'[1] – тип сигнала: 1) 4…20 мА; 2) 0…20 мА; 3) -20…+20 мА
[2] – направление движения: 0 – вперед; 1 – назад
[4] – ток ошибки: 0 – Сохранить исходное значение; 1 – максимальное значение',
'[1] – длина массива данных: 1 – 25 бит; 2 – 24 бит
[2] – кодировка: 1 – двоичная; 2 – код Грея
[3] – разрешение: 1 – 0,005 мм; 2 – 0,01 мм'
]
],
// ... другие группы параметров
];
// 2. Функция создания базы данных (без изменений)
function createDatabaseFromArray($dbArray, $dbPath = 'tldecoder.db') {
if (file_exists($dbPath)) unlink($dbPath);
$db = new SQLite3($dbPath);
$db->exec('CREATE TABLE parameters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER NOT NULL,
code TEXT NOT NULL,
meaning TEXT NOT NULL,
is_pattern BOOLEAN DEFAULT 0,
pattern TEXT
)');
$db->exec('CREATE TABLE parameter_options (
id INTEGER PRIMARY KEY AUTOINCREMENT,
parameter_id INTEGER NOT NULL,
option_num INTEGER NOT NULL,
option_value TEXT NOT NULL,
FOREIGN KEY(parameter_id) REFERENCES parameters(id)
)');
foreach ($dbArray as $group_id => $group) {
if (!isset($group['block']) continue;
foreach ($group['block'] as $index => $code) {
$cleanCode = strip_tags($code);
$meaning = $group['fields'][$index] ?? '';
$isPattern = preg_match('/\[.*?\]/', $cleanCode) ? 1 : 0;
$pattern = $isPattern ? $cleanCode : '';
$stmt = $db->prepare('INSERT INTO parameters (group_id, code, meaning, is_pattern, pattern)
VALUES (:group_id, :code, :meaning, :is_pattern, :pattern)');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$stmt->bindValue(':meaning', $meaning, SQLITE3_TEXT);
$stmt->bindValue(':is_pattern', $isPattern, SQLITE3_INTEGER);
$stmt->bindValue(':pattern', $pattern, SQLITE3_TEXT);
$stmt->execute();
$paramId = $db->lastInsertRowID();
if ($isPattern && $meaning) {
preg_match_all('/\[(\d+)\].*?(\d+)\)(.*?)(?=\n|$)/', $meaning, $matches);
foreach ($matches[1] as $i => $optionNum) {
$optionValue = trim($matches[3][$i]);
$stmt = $db->prepare('INSERT INTO parameter_options
(parameter_id, option_num, option_value)
VALUES (:param_id, :option_num, :option_value)');
$stmt->bindValue(':param_id', $paramId, SQLITE3_INTEGER);
$stmt->bindValue(':option_num', $optionNum, SQLITE3_INTEGER);
$stmt->bindValue(':option_value', $optionValue, SQLITE3_TEXT);
$stmt->execute();
}
}
}
}
return $dbPath;
}
// 3. Функция обработки шаблонных параметров
function parsePatternParameter($db, $baseCode, $paramValue) {
$basePattern = substr($baseCode, 0, 1);
$optionsStr = substr($paramValue, strlen($basePattern));
$stmt = $db->prepare('SELECT id, pattern FROM parameters
WHERE code LIKE :pattern AND is_pattern = 1 LIMIT 1');
$stmt->bindValue(':pattern', "$basePattern%", SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if (!$result) return "Шаблон не найден";
$paramId = $result['id'];
preg_match_all('/\[(\d+)\]/', $result['pattern'], $matches);
$optionNumbers = $matches[1];
if (strlen($optionsStr) !== count($optionNumbers)) {
return "Неверное количество параметров";
}
$result = [];
foreach ($optionNumbers as $i => $optionNum) {
$optionValue = $optionsStr[$i];
$stmt = $db->prepare('SELECT option_value FROM parameter_options
WHERE parameter_id = :param_id AND option_num = :option_num');
$stmt->bindValue(':param_id', $paramId, SQLITE3_INTEGER);
$stmt->bindValue(':option_num', $optionNum, SQLITE3_INTEGER);
$res = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if (!$res) {
$result[] = "Параметр [$optionNum] не найден";
continue;
}
if (preg_match("/$optionValue\)(.*?)(?=\n|$)/", $res['option_value'], $m)) {
$result[] = trim($m[1]);
} else {
$result[] = "Значение $optionValue не найдено";
}
}
return implode("; ", $result);
}
// 4. Функция поиска параметра в БД
function findParameterInDB($db, $group_id, $code) {
$cleanCode = preg_replace('/\(.*?\)|\[.*?\]/', '', $code);
$cleanCode = trim($cleanCode);
// Проверка на шаблонный параметр (например A111)
if (preg_match('/^[A-Za-z]\d+$/', $cleanCode)) {
$baseCode = substr($cleanCode, 0, 1);
$paramValue = substr($cleanCode, 1);
$stmt = $db->prepare('SELECT id FROM parameters
WHERE group_id = :group_id AND code LIKE :code AND is_pattern = 1');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', "$baseCode%", SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
if ($result) {
return parsePatternParameter($db, $baseCode, $cleanCode);
}
}
// Поиск обычного параметра
$stmt = $db->prepare('SELECT meaning FROM parameters
WHERE group_id = :group_id AND code = :code');
$stmt->bindValue(':group_id', $group_id, SQLITE3_INTEGER);
$stmt->bindValue(':code', $cleanCode, SQLITE3_TEXT);
$result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);
return $result ? $result['meaning'] : "Параметр не найден";
}
// 5. Полная функция декодирования строки
function decodeTLString($db, $inputString) {
// Обработка строки (перевод в верхний регистр и замена кириллицы)
$upperString = mb_strtoupper($inputString);
$parts = explode('-', $upperString);
$result = [
'original' => $inputString,
'processed' => $upperString,
'parts' => []
];
// Соответствие позиций в строке группам параметров
$positionToGroup = [
1 => 1, // Тип датчика
2 => 2, // Интерфейс
3 => 3, // Точность
4 => 4, // Исполнение
5 => 5, // Темп. диапазон
6 => 6, // Длина (особый случай)
7 => 7, // Монтаж
8 => 8, // Диаметр ИЭ
9 => 9, // Присоединение
10 => 10, // Позиционер
11 => 11, // Эл. присоединение
12 => 12, // Сертификат
13 => 13 // Исполнение
];
foreach ($parts as $pos => $part) {
if ($pos === 0) continue; // Пропускаем "ТЛ"
$group_id = $positionToGroup[$pos] ?? null;
if ($pos === 6) {
// Особый случай для длины
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Длина: $part мм",
'group' => 'length'
];
} elseif ($group_id !== null) {
$meaning = findParameterInDB($db, $group_id, $part);
$result['parts'][$pos] = [
'code' => $part,
'meaning' => $meaning,
'group' => $group_id
];
} else {
$result['parts'][$pos] = [
'code' => $part,
'meaning' => "Неизвестный параметр",
'group' => 'unknown'
];
}
}
return $result;
}
// Пример использования
// Создаем базу данных из тестового массива
$dbPath = createDatabaseFromArray($dbArray);
$db = new SQLite3($dbPath);
// Тестовая строка для декодирования
$inputString = 'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
// Декодируем строку
$result = decodeTLString($db, $inputString);
// Выводим результат
echo "<pre>";
print_r($result);
echo "</pre>";
// Закрываем соединение с БД
$db->close();
?>Полная реализация decodeTLString - функция теперь полностью обрабатывает все части строки
Тестовые данные - добавлен упрощенный тестовый массив $dbArray для демонстрации
Правильная обработка позиций - каждая часть строки корректно сопоставляется с группой параметров
Вывод результата - после выполнения print_r($result) теперь будет содержать все найденные параметры
Для вашего реального проекта:
Замените тестовый $dbArray на ваш полный массив данных
При необходимости добавьте дополнительные группы параметров
Убедитесь, что все шаблонные параметры (с квадратными скобками) правильно разбираются
Пример вывода для тестовой строки:
Array
(
[original] => ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0
[processed] => ТЛ-СФ2-А111-005-ВН[У]-Т3-80-Н33-10-Ф-ПК1-КБН(0)-0
[parts] => Array
(
[1] => Array
(
[code] => СФ2
[meaning] => Стержневая с фланцем типа 2
[group] => 1
)
[2] => Array
(
[code] => А111
[meaning] => 4…20 мА; назад; максимальное значение
[group] => 2
)
[3] => Array
(
[code] => 005
[meaning] => Параметр не найден
[group] => 3
)
...
)
)