是否可以在PHP中使用多个键引用相同的值?

时间:2017-10-04 13:51:37

标签: php arrays key refactoring code-cleanup

我想知道是否有可能清理这个代码...我有一系列汽车类别,每个钥匙都是车辆代码。我将几个车辆代码映射到特定类别(例如,小型,中型,大型)。我以前曾问过类似的问题,但我不确定它是否清楚,所以我简化了我的问题。 我想保留这种类似的格式,但想知道是否可以做这样的事情(这样我就不必写#34; Small"更多而不是一次):

        $categories = [
            'L...' => 'Luxury',
            'W...' => 'Luxury',
            'X...' => 'Specialty',

            'CB..', 'CC..', 'CD..' => 'Small' 
            // Is something like this possible to do within the $categories array ?
        ];

当前代码:

        $categories = [
            'L...' => 'Luxury',
            'W...' => 'Luxury',
            'X...' => 'Specialty',

            'CB..' => 'Small',
            'CC..' => 'Small',
            'CD..' => 'Small',
            'DB..' => 'Small',
            'DC..' => 'Small',
            'DD..' => 'Small',
            'EB..' => 'Small',
            'EC..' => 'Small',
            'ED..' => 'Small',
            'HB..' => 'Small',
            'HC..' => 'Small',
            'HD..' => 'Small',
            'MB..' => 'Small',
            'MC..' => 'Small',
            'MD..' => 'Small',
            'NB..' => 'Small',
            'NC..' => 'Small',
            'ND..' => 'Small',

            'IB..' => 'Medium',
            'IC..' => 'Medium',
            'ID..' => 'Medium',
            'JB..' => 'Medium',
            'JC..' => 'Medium',
            'JD..' => 'Medium',
            'RB..' => 'Medium',
            'RC..' => 'Medium',
            'RD..' => 'Medium',
            'SB..' => 'Medium',
            'SC..' => 'Medium',
            'SD..' => 'Medium',

            'FB..' => 'Large',
            'FC..' => 'Large',
            'FD..' => 'Large',
            'GB..' => 'Large',
            'GC..' => 'Large',
            'GD..' => 'Large',
            'PB..' => 'Large',
            'PC..' => 'Large',
            'PD..' => 'Large',
            'UB..' => 'Large',
            'UC..' => 'Large',
            'UD..' => 'Large',

            '.E..' => 'Sports', // Coupe
            '.F..' => 'SUV',
            '.G..' => 'SUV', // Crossover
            '.H..' => 'RV', // Motor Home
            '.J..' => 'Off-Road Vehicle',
            '.K..' => 'Commercial',
            '.L..' => 'Luxury', // Limousine
            '.M..' => 'Van', // Monospace
            '.N..' => 'Convertible', // Roadster
            '.P..' => 'Pickup Truck',
            '.Q..' => 'Pickup Truck',
            '.R..' => 'RV',
            '.S..' => 'Sports',
            '.T..' => 'Convertible',
            '.V..' => 'Van',
            '.W..' => 'Wagon',
            '.X..' => 'Specialty',
            '.Z..' => 'Specialty',

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

3 个答案:

答案 0 :(得分:2)

按照@ CD001的评论,您可以通过反转数组并将代码存储在类别中来实现这一点,然后使用一个小函数匹配其找到的并返回键/类别。

<?php
$categories = [
    'Luxury' => [
        'L...',
        'W...'
    ],
    'Specialty' => [
        'X...',
        '.Z..',
        '.X..'
    ],
    'Sports' => [
        '.E..',
        '.S..'
    ],
    'SUV' => [
        '.F..',
        '.G..'
    ],
    'RV' => [
        '.H..',
        '.R..'
    ],
    'Off-Road Vehicle' => [
        '.J..'
    ],
    'Commercial' => [
        '.K..'
    ],
    'Van' => [
        '.M..',
        '.V..'
    ],
    'Convertible' => [
        '.N..',
        '.T..'
    ],
    'Pickup Truck' => [
        '.P..',
        '.Q..',
    ],
    'Wagon' => [
        '.W..'
    ],
    'Electric' => [
        '...C',
        '...E'
    ],
    'Hybrid' => [
        '...H',
        '...I'
    ],
    'Small' => [
        'CB..',
        'CC..',
        'CD..',
        'DB..',
        'DC..',
        'DD..',
        'EB..',
        'EC..',
        'ED..',
        'HB..',
        'HC..',
        'HD..',
        'MB..',
        'MC..',
        'MD..',
        'NB..',
        'NC..',
        'ND..'
    ],
    'Medium' => [
        'IB..',
        'IC..',
        'ID..',
        'JB..',
        'JC..',
        'JD..',
        'RB..',
        'RC..',
        'RD..',
        'SB..',
        'SC..',
        'SD..'
    ],
    'Large' => [
        'FB..',
        'FC..',
        'FD..',
        'GB..',
        'GC..',
        'GD..',
        'PB..',
        'PC..',
        'PD..',
        'UB..',
        'UC..',
        'UD..'
    ],
];

$getType = function($search) use ($categories) {
    foreach ($categories as $k => $v) {
        $key = array_search($search, $v);
        if ($key !== false) {
            return $k;
        }
    }
};

print_r(
    // Hybrid
    $getType('...H')
);

但它仍然是一个大阵列,但至少你不会重复Small。您可以删除空格,如下所示:

<?php
$categories = [
    'Luxury' => [
        'L...', 'W...'
    ],
    'Specialty' => [
        'X...', '.Z..', '.X..'
    ],
    'Sports' => [
        '.E..', '.S..'
    ],
    'SUV' => [
        '.F..', '.G..'
    ],
    'RV' => [
        '.H..', '.R..'
    ],
    'Off-Road Vehicle' => [
        '.J..'
    ],
    ...

或者将它们放在数据库中,然后它会更清洁。

编辑:非常感谢@ CD001

$getType = function($search, $bestMatch = false) use ($categories) { 
    $search = str_pad($search, 4, ".", STR_PAD_RIGHT);
    $out = []; 
    foreach ($categories as $k => $v) { 
        foreach ($v as $r) { 
            if (preg_match('/' . $r . '/', $search)) { 
                $out[] = $k; 
            }
        }
    }

    if ($bestMatch) {
        // work out best match by adding a count
        $out = array_count_values($out);
        // sort
        arsort($out);
        //return the best match
        $out = array_keys(array_slice($out, 0, 1))[0];
    } else {
        $out = array_values(array_unique($out));
    }
    return $out;
};

/*
Array
(
    [0] => Luxury
    [1] => Convertible
)
*/
print_r(
    $getType('LTAR')
);

//Luxury
print_r(
    $getType('LTAR', true)
);

答案 1 :(得分:1)

是否应该重新排列此阵列取决于您需要使用它做什么。如果您需要根据车辆代码查找类别,您不应该更改

现在的方式,你可以快速有效地获得一个类别。

$category = $categories[$vehicle_code];

如果将其更改为多维结构,则此查找本身会更慢且更复杂。有不同的方法可以做到这一点,但它需要一些版本的循环代码的所有子代码,直到找到包含代码的代码。

foreach ($categories as $cat => $codes) {
    if (in_array($vehicle_code, $codes)) {
        $category = $cat;
        break;
    }
}

另一方面,如果您需要显示某个类别的所有车辆代码,那么多维结构将更好地发挥作用。

如果您需要同时执行这两项操作或需要在车辆代码和类别之间定义关系的各种其他事项,则应考虑将此数据存储在数据库中。就个人而言,无论如何,我认为你应该考虑一下。这看起来像是潜在的动态数据,如果您将其存储在应用程序代码中,只要您添加或更新车辆代码或类别,就会有新版本的应用程序。

答案 2 :(得分:0)

您可以使用array_fill_keys之类的

<?php

$aKeys = ['A','B','C'];

$aResult = array_fill_keys ( $aKeys , 'small' );

print_r($aResult);