Реорганизация группировки и сопоставления массивов PHP

Цель

Мне интересно, есть ли лучший способ кодировать эту проблему? Если возможно, я бы хотел провести рефакторинг.

Требования:

  • Учитывая список кодов транспортных средств ACRISS (http://www.acriss.org/car-codes.asp), сгруппируйте машины по категориям в зависимости от их персонажей. Автомобиль можно сгруппировать в 1 или несколько категорий. Пример LTAR: поскольку L - первый символ, он будет сгруппирован в Luxury, а поскольку T - второй символ, он также будет сгруппирован как Convertible.
  • Компактный - CB .., CC .., CD .. (любые коды транспортных средств, начинающиеся с CB, CC или CD. Примеры: CBAR, CDAR, CCAR)
  • Экономика - EB .., EC .., ED ..
  • Полноразмерный - FB .., FC .., FD ..
  • Роскошь - L ... (начинается с L)
  • Ван - .F .. (второй символ - F)
  • Конвертируемый - .T .. (второй символ - T, например: DTAR)
  • Гибрид - ... H (четвертый символ - H или I, например: CCAH)
  • Электрический - ... C (четвертый символ - C или E, например: CCAE)

Примеры ввода (каждый код автомобиля всегда состоит из 4 символов):

  1. ИКАР
  2. CCAR
  3. SFAR
  4. ЗВЕЗДА
  5. LTAR

Ожидаемый результат:

  1. [категория] => Массив ([0] => Экономика)
  2. [категория] => Массив ([0] => Компактный)
  3. [категория] => Массив ([0] => внедорожник)
  4. [категория] => Массив ([0] => Конвертируемый)
  5. [категория] => Массив ([0] => Люкс [1] => Кабриолет)

Код:

        $vehicle_code = str_split($new_car->type);
        $categories = [
            'CB' => 'Compact',
            'CC' => 'Compact',
            'CD' => 'Compact',

            'EB' => 'Economy',
            'EC' => 'Economy',
            'ED' => 'Economy',

            '0L' => 'Luxury',

            '1T' => 'Convertible',
            '1V' => 'Van',

            '3H' => 'Hybrid',
            '3I' => 'Hybrid',
            '3C' => 'Electric',
            '3E' => 'Electric',
        ];

        foreach($vehicle_code as $key=>$character) {
            if (array_key_exists($key.$character,$categories))
            {
                $new_car->category[] = $categories[$key.$character];
            }
        }

        if (array_key_exists(substr($new_car->type, 0, 2),$categories))
        {
            $new_car->category[] = $categories[substr($new_car->type, 0, 2)];
        }

person Michael Alterio    schedule 03.10.2017    source источник
comment
Может быть, это только я, но я понятия не имею, о чем вы на самом деле спрашиваете.   -  person Andreas    schedule 03.10.2017
comment
Возможно, я понял, о чем вы спрашиваете. Это в правильном направлении? 3v4l.org/TRYEL   -  person Andreas    schedule 03.10.2017
comment
@Andreas Я обновил вопрос, добавив дополнительную информацию. Дайте мне знать, если теперь в этом больше смысла.   -  person Michael Alterio    schedule 03.10.2017
comment
Вы даже не можете прокомментировать мой ответ?   -  person Andreas    schedule 04.10.2017


Ответы (2)


Вместо того, чтобы иметь список всех кодов транспортных средств, создайте отдельные списки для пар код / ​​категория первого символа и пар код / ​​категория последнего символа. Затем в своем цикле вы можете использовать substr($your_vehicle_code, $index_0_or_1, 1), чтобы получить первый или второй символ и проверить его наличие в соответствующем массиве. Это позволит вам сократить по три записи каждая из Compact, Economy, Premium, Mid-Size и Standard до одной, а также приведёт вашу функциональность в большее соответствие с предоставленными требованиями.

Например, ваш первый массив категорий символов может выглядеть примерно так:

$first_char_categories = [
    'C' => 'Compact',
    'E' => 'Economy',
    'I' => 'Mid-Size',
    'P' => 'Premium',
    'S' => 'Standard'
];

Затем вы можете проверить код следующим образом:

$my_vehicle_code = 'CB';
$first_char = substr($my_vehicle_code, 0, 1); //gives us the character 'C'
if(isset($first_char_categories[$first_char])) {
    $first_char_category = $first_char_categories[$first_char];
    //do something with the first character category
}
person B. Fleming    schedule 03.10.2017
comment
Я обновил описание. Для Компактного, Экономичного, Среднего, Премиум и Стандартного мы должны смотреть на первые два символа. Для остальных он отличается. Только второй или четвертый символ определяет, к какой группе должна относиться машина. Не могли бы вы еще раз взглянуть? Спасибо. - person Michael Alterio; 03.10.2017

Попробуй это:

Я добавил только те, которые вы указали в примере, но просто следуйте шаблону для других.
Я также изменил «T» и «F» там, где у вас было «1T», важен ли 1?

$re = '/(EC)\w{2}|(CC)\w{2}|\w(F)\w{2}|(LT)\w{2}|\w(T)\w{2}/';
$str = 'STAR';

preg_match($re, $str, $matches);

// Remove empty values and reset keys
$cat = array_values(array_filter($matches));

    $categories = [
        'CB' => 'Compact',
        'CC' => 'Compact',
        'CD' => 'Compact',

        'EB' => 'Economy',
        'EC' => 'Economy',
        'ED' => 'Economy',

        'IB' => 'Mid-Size',
        'IC' => 'Mid-Size',
        'ID' => 'Mid-Size',

        'PB' => 'Premium',
        'PC' => 'Premium',
        'PD' => 'Premium',

        'SB' => 'Standard',
        'SC' => 'Standard',
        'SD' => 'Standard',

        '0L' => 'Luxury',

        'F' => 'SUV',
        '1G' => 'Crossover',
        '1K' => 'Commercial',
        '1P' => 'Pickup Truck',
        '1Q' => 'Pickup Truck',
        '1R' => 'RV',
        '1S' => 'Sports',
        'T' => 'Convertible',
        '1V' => 'Van',
        '1W' => 'Wagon',

        '3H' => 'Hybrid',
        '3I' => 'Hybrid',
        '3C' => 'Electric',
        '3E' => 'Electric',
    ];

//Echo category 
Echo $categories[$cat[1]];

https://3v4l.org/Sg5Xe

person Andreas    schedule 03.10.2017