重构PHP数组分组和映射

时间:2017-10-03 17:25:09

标签: php arrays multidimensional-array refactoring stdclass

目标

我想知道是否有更好的方法来编码这个问题?如果可能,我想重构。

要求:

  • 根据ACRISS车辆代码列表(http://www.acriss.org/car-codes.asp),根据车辆的角色将车辆分组。汽车可以分为一个或多个类别。 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. ECAR
  2. CCAR
  3. SFAR
  4. STAR
  5. LTAR
  6. 预期产出:

    1. [category] ​​=>数组([0] =>经济)
    2. [category] ​​=>数组([0] =>紧凑)
    3. [category] ​​=>数组([0] => SUV)
    4. [category] ​​=>数组([0] =>可转换)
    5. [category] ​​=>数组([0] =>豪华[1] =>可转换)
    6. 代码:

              $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)];
              }
      

2 个答案:

答案 0 :(得分:0)

不是拥有所有车辆代码的列表,而是为第一个字符的代码/类别对和最后一个字符的代码/类别对分别列出。然后,在循环中,您可以使用substr($your_vehicle_code, $index_0_or_1, 1)来获取第一个或第二个字符,并在相应的数组中检查它是否存在。这样,您就可以将CompactEconomyPremiumMid-SizeStandard各自的三个条目减少为一个,并且还可以放置您的功能更符合所提供的要求。

例如,您的第一个字符类别数组可能如下所示:

$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
}

答案 1 :(得分:0)

试试这个:

我只添加了你在示例中列出的那些,但只是按照其他人的模式 我也改变了" 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