За последние 24 часа нас посетили 17477 программистов и 1718 роботов. Сейчас ищут 1583 программиста ...

Выборка значений номерного знака

Тема в разделе "PHP для новичков", создана пользователем Sofia, 11 дек 2024.

  1. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    967
    Симпатии:
    2
    Доброго времени суток.
    Не знаю как правильно должен звучать мой вопрос, но попробую описать...
    Имеются автомобильные номера в базе данных. Они хранятся в табличке целиком (номер+регион).
    Так вот... стоит задача вывести отдельно номер и отдельно регион. Полагаю, что надо использовать какую-то функцию, которая разделяет все цифры с обратного порядка до букв, но как это сделать, не соображу. Поделитесь опытом плз. Как это реализовать?
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Добрый день!
    Попробуйте так
    PHP:
    1. <?
    2. function autoNumToArr($num){
    3.     preg_match_all("/\d+$/",$num, $match);
    4.     $region = $match[0][0];
    5.     $out[0] = explode($region,$num)[0];
    6.     $out[1] = $region;
    7.     return $out;
    8. }
    9.  
    10. echo "<pre>";
    11. print_r(autoNumToArr("м976мм777"));
    12. print_r(autoNumToArr("м976мм77"));
    13.  
    14. /*
    15. Array
    16. (
    17.     [0] => м976мм
    18.     [1] => 777
    19. )
    20. Array
    21. (
    22.     [0] => м976мм
    23.     [1] => 77
    24. )
    25. */
    Удачи!
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Дополнение.
    К сожалению, не могу исправить мой пост
    Это решение лучше
    PHP:
    1. <?
    2. function autoNumToArr($num){
    3.   preg_match_all("/(^\pL+\d+\pL+|\d+$)/ui",$num, $match);
    4.   return $match[0];
    5. }
    6.  
    7. echo "<pre>";
    8.  
    9. print_r(autoNumToArr("м976мм777"));
    10. print_r(autoNumToArr("M976ММ77"));
    11.  
    12.  
    13. /*
    14. Array
    15. (
    16.   [0] => м976мм
    17.   [1] => 777
    18. )
    19.  
    20. Array
    21. (
    22.   [0] => М976ММ
    23.   [1] => 77
    24. )
    25. */
     
    Sofia нравится это.
  4. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    967
    Симпатии:
    2
    Круто. Работает к сожалению только с автомобильными номерами... А вот к примеру мото номера не отрабатывает... Вот пример номера 1013УА44 (44 регион). Можно как-то добавить функционал?
     
  5. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Я не видел российских номеров. Напишите, если есть ещё другие варианты.
    Это с аато и мото номерами
    PHP:
    1. <?
    2. function autoNumToArr($num){
    3.     preg_match_all("/(^.+\pL+|\d+$)/ui",$num, $match);
    4.     return $match[0];
    5. }
    6.  
    7. echo "<pre>";
    8.  
    9. print_r(autoNumToArr("м976мм777"));
    10. print_r(autoNumToArr("M976ММ77"));
    11. print_r(autoNumToArr("1013УА44"));
    12.  
    13. /*
    14. Array
    15. (
    16.     [0] => м976мм
    17.     [1] => 777
    18. )
    19. Array
    20. (
    21.     [0] => M976ММ
    22.     [1] => 77
    23. )
    24. Array
    25. (
    26.     [0] => 1013УА
    27.     [1] => 44
    28. )
    29. */
    Удачи!
     
    Sofia нравится это.
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Если предполагается фильтрация по региону, то лучше сразу для него отдельную колонку завести, заранее проработать существующие номера, и для новых сразу делать выделение и запись региона в отдельную колонку
     
  7. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Конечно так лучше.
    Если бы изначально структура данных была так спроектирована, то и вопрос в данном случае не возник.
    Если не удасться завести отдельную колонку для регионов, то можно реализовать SQL запросы
    для выборки из базы данных по регинам и типу транспота
    PHP:
    1. <?
    2. function getAutoNumSqlFilter($feldName, $region = 0, $transportType = 0){
    3.  
    4.     /*
    5.         $feldName (str):
    6.         название поля номерного знака
    7.  
    8.         $region (int):
    9.         0 - все регионы
    10.         >0 - номер регионы
    11.  
    12.         $transportType (int):
    13.         0 - все
    14.         1 - автомобиль
    15.         2 - мотоцикл
    16.  
    17.     */
    18.  
    19.     $transportTypeFilter = ["","[[:alpha:]]","[[:digit:]]"];
    20.     $regionFilter = $region?"[[:alpha:]]$region$":"";
    21.     $transportFilter = $transportTypeFilter[$transportType];
    22.     $filter = "";
    23.     if($regionFilter OR $transportFilter)
    24.     {
    25.         $filter .= " WHERE $feldName REGEXP ";
    26.         $filter .= "'^$transportFilter";
    27.         if($regionFilter)
    28.             $filter .= ".+$regionFilter";
    29.         $filter .= "'";
    30.     }
    31.     return $filter;
    32. }
    33.  
    34. $filter = getAutoNumSqlFilter("num", 0, 1);
    35. echo $filter,"<br>";
    36. $filter = getAutoNumSqlFilter("num", 777, 1);
    37. echo $filter,"<br>";
    38. $filter = getAutoNumSqlFilter("num", 44, 2);
    39. echo $filter,"<br>";
    40.  
    41. $query = "SELECT num FROM `autonum` $filter";
    42. echo $query,"<br>";
    43. $result = mysqli_query($conn, $query);
    44. while ($row = mysqli_fetch_row($result)) {
    45.     echo $row[0],"<br>";
    46. }
    47.  
    48. /*
    49. WHERE num REGEXP '^[[:alpha:]]'
    50.  
    51. WHERE num REGEXP '^[[:alpha:]].+[[:alpha:]]777$'
    52.  
    53. WHERE num REGEXP '^[[:digit:]].+[[:alpha:]]44$'
    54.  
    55. SELECT num FROM `autonum`  WHERE num REGEXP '^[[:digit:]].+[[:alpha:]]44$'
    56.  
    57. 1013УА44
    58.  
    59. */
     
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    явно надо разносить, с регулярками нагрузка будет
     
  9. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Явно надо, но не в ручную ж...
    Для того чтоб разносить нужна регулярка
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Допустим, что в SQL-таблице autonum есть колонка "num", которую "надо разносить"
    т.е. из номера разносить будем регион и тип транспорта
    Дополним в таблице три колонки region, auto, moto
    Код (Text):
    1. ALTER TABLE `autonum`
    2.  
    3. ADD `region` INT NOT NULL AFTER `num`,
    4. ADD `auto` BOOLEAN NOT NULL AFTER `region`,
    5. ADD `moto` BOOLEAN NOT NULL AFTER `auto`;
    6.  
    7. UPDATE `autonum` SET
    8. `region` = REGEXP_SUBSTR(num,'[[:digit:]]+$'),
    9. `auto` = num REGEXP '^[[:alpha:]]{1}',
    10. `moto` = num REGEXP '^[[:digit:]]{1}';
    Результ
    Код (Text):
    1. CREATE TABLE `autonum` (
    2.  
    3.   `id` int NOT NULL,
    4.   `num` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    5.   `region` int NOT NULL,
    6.   `auto` tinyint(1) NOT NULL,
    7.   `moto` tinyint(1) NOT NULL
    8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    9.  
    10. --
    11. -- Daten für Tabelle `autonum`
    12. --
    13.  
    14. INSERT INTO `autonum` (`id`, `num`, `region`, `auto`, `moto`) VALUES
    15. (2, 'м976мм777', 777, 1, 0),
    16. (3, 'M976ММ77', 77, 1, 0),
    17. (5, '1013УА44', 44, 0, 1),
    18. (6, '3013УА77', 77, 0, 1);
     
  11. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    логику записи/чтения поменять и скриптом разок пройти
     
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    439
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Простите, не понял. Есть БД, в которую в одну колонку таблицы закачаны номера.
    С большой вероятностью данные экспортируются с Вебсервиса.
    БД должна быть не хилая (номера со всей страны)
    Вы предлагаете на PHP скрипт написать, который будет в БД " номера растаскивать"?
     
  13. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    967
    Симпатии:
    2
    Спасибо, то что надо )
     
  14. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    Возможно, можно обойтись несколькими SQL-запросами.