在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){