массивы — возможно ли иметь более одной ключевой ссылки на одно и то же значение в PHP?

Мне интересно, можно ли немного очистить этот код … У меня есть массив категорий автомобилей, и каждый ключ — это код автомобиля. Есть несколько кодов транспортных средств, которые я сопоставляю с определенной категорией (например, Маленький, Средний, Большой). Я задавал подобный вопрос ранее, но я не уверен, что это было ясно, поэтому я упростил свой вопрос. Я хотел бы сохранить этот аналогичный формат, но мне интересно, возможно ли сделать что-то подобное (чтобы мне не приходилось писать «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'
];

0

Решение

Следуя комментарию @ 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)
);
2

Другие решения

Нужно ли вам переставлять этот массив, зависит от того, что вам нужно с ним делать. Если вам нужно искать категории на основе кодов транспортных средств, ты не должен менять это.

Так, как сейчас, вы можете получить категорию быстро и эффективно.

$category = $categories[$vehicle_code];

Если вы измените его на многомерную структуру, этот поиск будет медленнее и сложнее. Есть разные способы сделать это, но это потребует некоторой версии зацикливания всех под-массивов кодов, пока вы не найдете тот, в котором есть ваш код.

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

С другой стороны, если вам нужно показать все коды транспортных средств для определенной категории, то многомерная структура будет работать лучше для этого.

Если вам нужно сделать обе эти вещи или другие различные вещи, которые требуют определенных отношений между кодами транспортных средств и категориями, вам следует рассмотреть возможность сохранения этих данных в базе данных. Лично я думаю, что вы все равно должны это учитывать. Это похоже на потенциально динамические данные, и если вы сохраните их в коде приложения, у вас будет новая версия приложения при каждом добавлении или обновлении кодов или категорий транспортных средств.

1

Ты можешь использовать array_fill_keys лайк

<?php

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

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

print_r($aResult);
0
По вопросам рекламы [email protected]