Преобразование номера в определенную группу

0

Я делаю веб-приложение для расчета данных дорожного налога. Для этого цена может опираться на вес автомобиля.

Полученные данные были примерно такими:

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.

Вопрос

Как мне сделать свой код так, чтобы он выберет правильный весовой класс после весового класса после него.

  • 0
    Хм, что ты имеешь в виду, когда или нет следующей весовой категории?
Теги:
oop

2 ответа

1
Лучший ответ

Попробуйте этот подход:

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];
}

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

  • 0
    Но что, если следующей весовой категории не существует?
  • 0
    В этом случае он возвращает последний класс.
Показать ещё 6 комментариев
1

Это может быть ответ, который вы ищете:

<?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;
}
?>
  • 0
    Но когда вы берете весовой класс, который выше, чем самый высокий индекс массива? Затем он возвращает значение 0. Какое должно быть последнее найденное значение?
  • 0
    Условие isset() даст истину или ложь существованию ключа, не вызывая ошибки. Если он возвращает true, он загружает следующий весовой класс, если это false, он идет на что-то, что вряд ли будет побеждено (то есть 999999999)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню