Я делаю веб-приложение для расчета данных дорожного налога. Для этого цена может опираться на вес автомобиля.
Полученные данные были примерно такими:
array (
1 =>
array (
'quarterly' => 57,
'yearly' => 228,
),
12000 =>
array (
'quarterly' => 62,
'yearly' => 248,
),
13000 =>
array (
'quarterly' => 68,
'yearly' => 272,
),
14000 =>
array (
'quarterly' => 74,
'yearly' => 296,
),
15000 =>
array (
'quarterly' => 79,
'yearly' => 316,
),
16000 =>
array (
'quarterly' => 85,
'yearly' => 340,
),
17000 =>
array (
'quarterly' => 91,
'yearly' => 364,
),
18000 =>
array (
'quarterly' => 97,
'yearly' => 388,
),
19000 =>
array (
'quarterly' => 102,
'yearly' => 408,
),
20000 =>
array (
'quarterly' => 108,
'yearly' => 432,
),
21000 =>
array (
'quarterly' => 114,
'yearly' => 456,
),
22000 =>
array (
'quarterly' => 119,
'yearly' => 476,
),
23000 =>
array (
'quarterly' => 125,
'yearly' => 500,
),
24000 =>
array (
'quarterly' => 131,
'yearly' => 524,
),
25000 =>
array (
'quarterly' => 137,
'yearly' => 548,
),
26000 =>
array (
'quarterly' => 142,
'yearly' => 568,
),
27000 =>
array (
'quarterly' => 148,
'yearly' => 592,
),
28000 =>
array (
'quarterly' => 154,
'yearly' => 616,
),
29000 =>
array (
'quarterly' => 159,
'yearly' => 636,
)
);
Числа (первый элемент в массиве, 1
, 1051
, 1151
, 1251
, 1351
, 1451 ,
т.д.) - это весовые классы, мне нужно проверить вес транспортного средства пользователя и проверить, к какому весовому классу он принадлежит.
Например, у меня есть автомобиль весом 600 кг, этот автомобиль относится к весовому классу 1
.
Если у меня есть пример, который весит 1150 кг, он относится к весовому классу 1051
.
Чтобы вычислить это, я использую этот метод:
public static function resolveWeightClass(array $data, $vehicleWeight) {
$weightClasses = array_keys($data);
for ($weightClassIndex = 0; $weightClassIndex < count($weightClasses); $weightClassIndex++) {
$weightClass = $weightClasses[$weightClassIndex];
if ($weightClass < $vehicleWeight) {
continue;
}
return $weightClass;
}
return 0;
}
data
- это где все ключи массива существуют из весовых классов.vehicleWeight
- вес транспортного средства.проблема
Когда я запускаю этот код, и автомобиль, например, 16500
KG, код по-прежнему выбирает весовой класс 17000
, когда мне нужен весовой класс 16000
.
Вопрос
Как мне сделать свой код так, чтобы он выберет правильный весовой класс после весового класса после него.
Попробуйте этот подход:
public static function resolveWeightClass(array $data, $vehicleWeight) {
$weightClasses = array_keys($data);
sort($weightClasses);
for($i = 0; $i < count($weightClasses) - 1; $i++) {
if($weightClasses[$i+1] > $vehicleWeight) {
return $weightClasses[$i];
}
}
return $weightClasses[$i];
}
Код выполняет итерацию по отсортированным клавишам и проверяет, не превышает ли следующий ключ вес транспортного средства. Если это так, он возвращает данные для текущего ключа.
Это может быть ответ, который вы ищете:
<?php
public static function resolveWeightClass(array $data, $vehicleWeight) {
$weightClasses = array_keys($data);
for ($weightClassIndex = 0; $weightClassIndex < count($weightClasses); $weightClassIndex++) {
$weightClass = $weightClasses[$weightClassIndex];
$nextWeightClass = (isset($weightClasses[$weightClassIndex+1]) ? $weightClasses[$weightClassIndex+1] : 99999999999);
if (($weightClass <= $vehicleWeight) && ($nextWeightClass > $vehicleWeight)) {
return $weightClass;
}
}
return 0;
}
?>
isset()
даст истину или ложь существованию ключа, не вызывая ошибки. Если он возвращает true, он загружает следующий весовой класс, если это false, он идет на что-то, что вряд ли будет побеждено (то есть 999999999)