Цель
Мне интересно, есть ли лучший способ кодировать эту проблему? Если возможно, я бы хотел провести рефакторинг.
Требования:
- Учитывая список кодов транспортных средств 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 символов):
- ИКАР
- CCAR
- SFAR
- ЗВЕЗДА
- LTAR
Ожидаемый результат:
- [категория] => Массив ([0] => Экономика)
- [категория] => Массив ([0] => Компактный)
- [категория] => Массив ([0] => внедорожник)
- [категория] => Массив ([0] => Конвертируемый)
- [категория] => Массив ([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)];
}