【问题标题】:Refactor PHP Array Grouping and Mapping重构 PHP 数组分组和映射
【发布时间】:2018-03-14 23:30:49
【问题描述】:

目标

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

要求:

  • 给定 ACRISS 车辆代码列表 (http://www.acriss.org/car-codes.asp),根据车辆的字符将车辆分组。一辆车可以分为一个或多个类别。 LTAR 示例:由于 L 是第一个字符,它将被归类为 Luxury,并且由于 T 是第二个字符,它也将被归类为敞篷车。
  • 紧凑型 - CB..、CC..、CD..(任何以 CB、CC 或 CD 开头的车辆代码。示例:CBAR、CDAR、CCAR)
  • 经济 - EB..,EC..,ED..
  • 全尺寸 - FB..,FC..,FD..
  • 奢侈品 - L...(以 L 开头)
  • Van - .F..(第二个字符是 F)
  • 可转换 - .T..(第二个字符是 T,例如:DTAR)
  • 混合 - ...H(第四个字符是 H 或 I,例如:CCAH)
  • 电动 - ...C(第四个字符是 C 或 E,例如:CCAE)

输入示例(每个车辆代码总是有 4 个字符):

  1. ECAR
  2. CCAR
  3. SFAR
  4. 明星
  5. LTAR

预期输出:

  1. [类别] => 数组([0] => 经济)
  2. [类别] => 数组([0] => 紧凑)
  3. [类别] => 数组([0] => SUV)
  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)];
        }

【问题讨论】:

  • 也许只有我一个人,但我不知道你到底在问什么。
  • 我可能已经明白你在问什么了。这是在正确的方向吗? 3v4l.org/TRYEL
  • @Andreas 我已经用更多信息更新了这个问题。如果现在更有意义,请告诉我。
  • 你甚至不能评论我的回答?

标签: php arrays multidimensional-array refactoring stdclass


【解决方案1】:

不是所有车辆代码的列表,而是为第一个字符代码/类别对和最后一个字符代码/类别对提供单独的列表。然后,在您的循环中,您可以使用 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
}

【讨论】:

  • 我已经更新了描述。对于 Compact、Economy、Mid-Size、Premium 和 Standard,我们应该关注前两个字符。其他的就不同了。仅第二个字符或仅第四个字符决定了汽车应属于哪个组。你介意再看看吗?谢谢。
【解决方案2】:

试试这个:

我只添加了您在示例中列出的那些,但只是按照其他人的模式。
我还更改了你有“1T”的“T”和“F”,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2019-04-11
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多