Доброго времени суток. Не знаю как правильно должен звучать мой вопрос, но попробую описать... Имеются автомобильные номера в базе данных. Они хранятся в табличке целиком (номер+регион). Так вот... стоит задача вывести отдельно номер и отдельно регион. Полагаю, что надо использовать какую-то функцию, которая разделяет все цифры с обратного порядка до букв, но как это сделать, не соображу. Поделитесь опытом плз. Как это реализовать?
Добрый день! Попробуйте так PHP: <? function autoNumToArr($num){ preg_match_all("/\d+$/",$num, $match); $region = $match[0][0]; $out[0] = explode($region,$num)[0]; $out[1] = $region; return $out; } echo "<pre>"; print_r(autoNumToArr("м976мм777")); print_r(autoNumToArr("м976мм77")); /* Array ( [0] => м976мм [1] => 777 ) Array ( [0] => м976мм [1] => 77 ) */ Удачи!
Дополнение. К сожалению, не могу исправить мой пост Это решение лучше PHP: <? function autoNumToArr($num){ preg_match_all("/(^\pL+\d+\pL+|\d+$)/ui",$num, $match); return $match[0]; } echo "<pre>"; print_r(autoNumToArr("м976мм777")); print_r(autoNumToArr("M976ММ77")); /* Array ( [0] => м976мм [1] => 777 ) Array ( [0] => М976ММ [1] => 77 ) */
Круто. Работает к сожалению только с автомобильными номерами... А вот к примеру мото номера не отрабатывает... Вот пример номера 1013УА44 (44 регион). Можно как-то добавить функционал?
Я не видел российских номеров. Напишите, если есть ещё другие варианты. Это с аато и мото номерами PHP: <? function autoNumToArr($num){ preg_match_all("/(^.+\pL+|\d+$)/ui",$num, $match); return $match[0]; } echo "<pre>"; print_r(autoNumToArr("м976мм777")); print_r(autoNumToArr("M976ММ77")); print_r(autoNumToArr("1013УА44")); /* Array ( [0] => м976мм [1] => 777 ) Array ( [0] => M976ММ [1] => 77 ) Array ( [0] => 1013УА [1] => 44 ) */ Удачи!
Если предполагается фильтрация по региону, то лучше сразу для него отдельную колонку завести, заранее проработать существующие номера, и для новых сразу делать выделение и запись региона в отдельную колонку
Конечно так лучше. Если бы изначально структура данных была так спроектирована, то и вопрос в данном случае не возник. Если не удасться завести отдельную колонку для регионов, то можно реализовать SQL запросы для выборки из базы данных по регинам и типу транспота PHP: <? function getAutoNumSqlFilter($feldName, $region = 0, $transportType = 0){ /* $feldName (str): название поля номерного знака $region (int): 0 - все регионы >0 - номер регионы $transportType (int): 0 - все 1 - автомобиль 2 - мотоцикл */ $transportTypeFilter = ["","[[:alpha:]]","[[:digit:]]"]; $regionFilter = $region?"[[:alpha:]]$region$":""; $transportFilter = $transportTypeFilter[$transportType]; $filter = ""; if($regionFilter OR $transportFilter) { $filter .= " WHERE $feldName REGEXP "; $filter .= "'^$transportFilter"; if($regionFilter) $filter .= ".+$regionFilter"; $filter .= "'"; } return $filter; } $filter = getAutoNumSqlFilter("num", 0, 1); echo $filter,"<br>"; $filter = getAutoNumSqlFilter("num", 777, 1); echo $filter,"<br>"; $filter = getAutoNumSqlFilter("num", 44, 2); echo $filter,"<br>"; $query = "SELECT num FROM `autonum` $filter"; echo $query,"<br>"; $result = mysqli_query($conn, $query); while ($row = mysqli_fetch_row($result)) { echo $row[0],"<br>"; } /* WHERE num REGEXP '^[[:alpha:]]' WHERE num REGEXP '^[[:alpha:]].+[[:alpha:]]777$' WHERE num REGEXP '^[[:digit:]].+[[:alpha:]]44$' SELECT num FROM `autonum` WHERE num REGEXP '^[[:digit:]].+[[:alpha:]]44$' 1013УА44 */
Допустим, что в SQL-таблице autonum есть колонка "num", которую "надо разносить" т.е. из номера разносить будем регион и тип транспорта Дополним в таблице три колонки region, auto, moto Код (Text): ALTER TABLE `autonum` ADD `region` INT NOT NULL AFTER `num`, ADD `auto` BOOLEAN NOT NULL AFTER `region`, ADD `moto` BOOLEAN NOT NULL AFTER `auto`; UPDATE `autonum` SET `region` = REGEXP_SUBSTR(num,'[[:digit:]]+$'), `auto` = num REGEXP '^[[:alpha:]]{1}', `moto` = num REGEXP '^[[:digit:]]{1}'; Результ Код (Text): CREATE TABLE `autonum` ( `id` int NOT NULL, `num` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `region` int NOT NULL, `auto` tinyint(1) NOT NULL, `moto` tinyint(1) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Daten für Tabelle `autonum` -- INSERT INTO `autonum` (`id`, `num`, `region`, `auto`, `moto`) VALUES (2, 'м976мм777', 777, 1, 0), (3, 'M976ММ77', 77, 1, 0), (5, '1013УА44', 44, 0, 1), (6, '3013УА77', 77, 0, 1);
Простите, не понял. Есть БД, в которую в одну колонку таблицы закачаны номера. С большой вероятностью данные экспортируются с Вебсервиса. БД должна быть не хилая (номера со всей страны) Вы предлагаете на PHP скрипт написать, который будет в БД " номера растаскивать"?