在PHP中有可能有多个键引用具有相同的值吗?

在PHP中有可能有多个键引用具有相同的值吗?,php,arrays,key,refactoring,code-cleanup,Php,Arrays,Key,Refactoring,Code Cleanup,我想知道是否有可能清理一下这个代码…我有一个汽车类别数组,每个钥匙都是一个车辆代码。我正在将几个车辆代码映射到特定类别(例如,小型、中型、大型)。我以前也问过类似的问题,但我不确定是否清楚,所以我简化了我的问题。我希望保持这种类似的格式,但想知道是否有可能这样做(这样我就不必多次写“小”): 当前代码: $categories = [ 'L...' => 'Luxury', 'W...' => 'Luxury',

我想知道是否有可能清理一下这个代码…我有一个汽车类别数组,每个钥匙都是一个车辆代码。我正在将几个车辆代码映射到特定类别(例如,小型、中型、大型)。我以前也问过类似的问题,但我不确定是否清楚,所以我简化了我的问题。我希望保持这种类似的格式,但想知道是否有可能这样做(这样我就不必多次写“小”):

当前代码:

        $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'
        ];
你可以用like

您可以使用


在@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')
);
或者把它们放在数据库里,这样会更干净

编辑:非常感谢@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)
);

在@CD001的注释之后,您可以通过反转数组并将代码存储在category中来实现这一点,然后使用一个小函数来匹配它的find并返回key/category

<?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')
);
或者把它们放在数据库里,这样会更干净

编辑:非常感谢@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)
);

是否应该重新排列此数组取决于需要对其执行的操作。如果需要根据车辆代码查找类别,则不应更改

按照现在的方式,您可以快速高效地获取类别

$category = $categories[$vehicle_code];
如果您将其更改为多维结构,则此查找将天生较慢且更复杂。有不同的方法可以做到这一点,但它需要某种版本的循环所有代码的子数组,直到您找到其中包含您的代码的子数组

foreach ($categories as $cat => $codes) {
    if (in_array($vehicle_code, $codes)) {
        $category = $cat;
        break;
    }
}
另一方面,如果需要显示某一类别的所有车辆代码,则多维结构将更好地用于此目的


如果你需要做这两件事,或者其他需要车辆代码和类别之间定义关系的事情,你应该考虑把这些数据存储在一个数据库中。就我个人而言,我认为你应该考虑一下。这看起来像是潜在的动态数据,如果您将其存储在应用程序代码中,则在添加或更新车辆代码或类别时,您将获得应用程序的新版本。

是否应重新排列此数组取决于您需要对其执行的操作。如果需要根据车辆代码查找类别,则不应更改

按照现在的方式,您可以快速高效地获取类别

$category = $categories[$vehicle_code];
如果您将其更改为多维结构,则此查找将天生较慢且更复杂。有不同的方法可以做到这一点,但它需要某种版本的循环所有代码的子数组,直到您找到其中包含您的代码的子数组

foreach ($categories as $cat => $codes) {
    if (in_array($vehicle_code, $codes)) {
        $category = $cat;
        break;
    }
}
另一方面,如果需要显示某一类别的所有车辆代码,则多维结构将更好地用于此目的



如果你需要做这两件事,或者其他需要车辆代码和类别之间定义关系的事情,你应该考虑把这些数据存储在一个数据库中。就我个人而言,我认为你应该考虑一下。这看起来像是潜在的动态数据,如果您将其存储在应用程序代码中,则在添加或更新车辆代码或类别时,您将获得应用程序的新版本。

为什么不使用多维数组,反之亦然?e、 g.
$categories=['Luxury'=>['L'、'W']、'specialistic'=>['X']]等为什么要将这些数据存储在代码中?@CD001啊,好吧,这很好-如果我这样做,我如何能够循环遍历每个值?这完全取决于您尝试执行的操作,您可以使用a来查找您要查找的项-尽管您可能最好在开始时以不同的方式构造数据,在数据库中,或者甚至在推送时在XML文件中,您已经获得了更容易获得的特性。为什么不使用多维数组呢?e、 g.
$categories=['Luxury'=>['L'、'W']、'specialistic'=>['X']]等为什么要将这些数据存储在代码中?@CD001啊,好吧,这很好-如果我这样做,我如何能够循环遍历每个值?这完全取决于您尝试执行的操作,您可以使用a来查找您要查找的项-尽管您可能最好在开始时以不同的方式构造数据,在数据库中,或者甚至在推送的XML文件中,您已经获得了更容易获得的特性。非常感谢!这真的很有帮助!我的目标是返回类别名称,因此如果车辆代码为“MCAR”,我希望它返回“Small”,因为M和C是第一个和第二个字母['MC…'。]。如果我想在小范围内将MCAR与['MC..]]进行比较,有什么想法可以通过这种方法实现这一点?再次感谢!!有趣的/可能的,用更多代码的注释可以测试一些东西,MC是否有任何情况意味着说MediumLTAR=豪华型和敞篷车(因为L是第一个字母,T是第二个字母…在某些情况下会重叠),FBAR=大型,XXXC=电动(因为C是最后一个字母),PQXX=皮卡车(因为Q是第二个字母)…这有意义吗?因为
在RegExp中是一个通配符,您可以将值视为模式:
LTAR
将被匹配,在这种情况下,由
/L../
/.T../
-函数可以返回类似
['lux','converable']
表示这两个类别。由于我们使用的可能值集非常有限,因此我们可能会忽略它(似乎没有任何重叠)。只需稍微调整一下
$getType
函数…
$getType=function($search)use($categories){$out=[];foreach($categories as$k=>$v){foreach($v as$r){