Помогите со switch

user999

Новичок
Помогите реализовать в switch проход циклом по массиву.
Если делать "вручную", то получается:
PHP:
$a=9;
switch ($a) {
    case ($a <-25):
        echo "красный";
        break;
    case ($a <-10):
        echo "желтый";
        break;
    case ($a >10):
        echo "желтый";
        break;
    case ($a >25):
        echo "красный";
        break;
    default:
        echo "зеленый";
        break;
}
А если массивом и foreach, то нет:
PHP:
$a = 9;
$b = array("<-25" => "красный", "<-10" => "желтый", ">10" => "желтый", ">25" => "красный");
switch ($a) {
    foreach ($b as $key => $value) {
        case ($a $key):
            echo $value;
        break; 
    }
    default:
        echo "зеленый";
        break;
}
 

fixxxer

К.О.
Партнер клуба
Потому что второе написано не на php, а на каком-то выдуманном тобой языке.
 

WMix

герр M:)ller
Партнер клуба
PHP:
echo $a > -10 && $a < 10 ? 'желтый' : ($a < -25 || $a > 25 ? 'красный' : 'зеленый');
 

user999

Новичок
echo $a > -10 && $a < 10 ? 'желтый' : ($a < -25 || $a > 25 ? 'красный' : 'зеленый');
это то же вручную.
Есть некие условия. Мы их не знаем. Их количество то же. Как их хранить в базе данных а потом с ними сравнивать переменную?
Как вариант - хранение в виде массива:
PHP:
$b = array("<-25" => "красный", "<-10" => "желтый", ">10" => "желтый", ">25" => "красный");
Но как переменную с этими условиями сравнить?
Что бы было понятно: переменная - это данные с датчика, например, температуры.
Но датчики бывают разные: на улице - это одни условия, внутри помещения, другие, температура воды, третье.
 

Breeze

goshogun
Команда форума
Партнер клуба
Но как переменную с этими условиями сравнить?
Строить интервалы, например:
PHP:
// Это только пример показывающий идею.
// В реальной жизни не стоит использовать без применения головы.

$result = 'зеленый';

$current_value = 11;

$rules = [
    [
        'result'=>'красный',
        'start'=>-25,
        'end'=>-PHP_INT_MAX
    ],
    [
        'result'=>'желтый',
        'start'=>-10,
        'end'=>-25
    ],
    [
        'result'=>'желтый',
        'start'=>25,
        'end'=>10
    ],
    [
        'result'=>'красный',
        'start'=>PHP_INT_MAX,
        'end'=>25
    ],
];

foreach ( $rules as $check_values ) {
    if ( $current_value <= $check_values['start'] && $current_value > $check_values['end'] ) {
        $result = $check_values['result'];
        break;
    }
}

print $result.PHP_EOL;
Интервалы они и в базе отлично работают ;)

Домашнее задание: придумать, как реализовать различные условия в if в зависимости от ситуации.
 

WMix

герр M:)ller
Партнер клуба
Есть некие условия. Мы их не знаем.
в этом и дело что условий нет и до тех пор пока они не названы писать можно что угодно
PHP:
echo $a > $yellow_min && $a < $yellow_max ? 'желтый' : ($a < $red_min || $a > $red_max ? 'красный' : 'зеленый');
держи $yellow_* и $red_* в базе!
 

fixxxer

К.О.
Партнер клуба
Да там на самом деле интервалы и не нужны, достаточно отсортированного массива с максимумами или минимумами.
PHP:
function getColorLabel(float $value):string {
    static $map = [
        -25 => 'yellow',
        -10 => 'green',
        10 => 'yellow',
        25 => 'red',
    ];
    $result = 'red';
    reset($map);
    while (([$limit, $label] = each($map)) && ($value > $limit || ($limit < 0 && $value == $limit))) {
        $result = $label;
    }
    return $result;
}
 
Последнее редактирование:

user999

Новичок
У меня ошибку этот код выдает
Код:
Parse error: syntax error, unexpected ':', expecting '{' in
 

user999

Новичок
боюсь что я это задание пока не осилю))
Помогите, пожалуйста))
 

user999

Новичок
Всем спасибо. В итоге сделал так:
PHP:
$current_value = -10;
$rules = array(
    array(
        'result'=>'красный',
        'start'=>-25,
        'end'=>-PHP_INT_MAX
    ),
    array(
        'result'=>'красный',
        'start'=>PHP_INT_MAX,
        'end'=>25
    ),
    array(
        'result'=>'желтый',
        'start'=>-10,
        'end'=>-25
    ),
    array(
        'result'=>'желтый',
        'start'=>25,
        'end'=>10
    )

);
foreach ($rules as $check_values) {
    if ($current_value <= $check_values['start'] && $current_value >= $check_values['end']) {
        $result = $check_values['result'];
        break;
    } else {
        $result = "зеленый";
    }
}
print $result.PHP_EOL;
 

Breeze

goshogun
Команда форума
Партнер клуба
гм. с 5.4 додумался как переделать, а с 7 нет.
 

user999

Новичок
так квадратные скобки на круглые поменять, ума много не надо)))
Еще раз СПАСИБО. Все работает. В базе все хранится и выводится как надо. Отлично
 
Сверху