Php Как избавиться от множества if

327
10 декабря 2016, 10:18

Я получаю 3 значения которые могут быть равны low, medium, high каждое. Дальше нужно в зависимости от этих значений вывести число. Всего от 1 до 27. Писать через if не красиво. Выходит что то вродь этого. А как это написать красиво я не пойму.

if ($_GET[smile1] == low){
    if ($_GET[smile2] == low){
        if($_GET[smile3] == low){
            echo "1";
        }
    }
}
if ($_GET[smile1] == low){
    if ($_GET[smile2] == low){
        if($_GET[smile3] == medium){
            echo "4";
        }
    }
}
if ($_GET[smile1] == low){
    if ($_GET[smile2] == low){
        if($_GET[smile3] == high){
            echo "7";
        }
    }
}
Answer 1
$values = array(
   "low"    => array("low"=>1, "medium"=>2, "high"=>3),
   "medium" => array("low"=>4, "medium"=>5, "high"=>6),
   "high"   => array("low"=>7, "medium"=>8, "high"=>9),
);
$value = $values[$_GET['smile1']][$_GET['smile2']];

аналогично для трех ключей - еще один уровень вложенности. Это точно быстрее вложенных if-ов и не медленнее, чем switch.

Answer 2
// Работаем как с троичной системой
$num_value = ['low' => 0, 'medium' => 1, 'high' => 2];
// Разряды. smile1 самый "слабый", младший разряд.
$r1 = $num_value[$_GET['smile1']];
$r2 = $num_value[$_GET['smile2']];
$r3 = $num_value[$_GET['smile3']];
// $r1 * 1 - здесь 1 - это 3 в степени 0
// + 1 - здесь 1 - это для поправки, так как в вопросе счёт с 1, а не 0
$value = $r1 * 1 + $r2 * 3 + $r3 * 3 * 3 + 1;
Answer 3

Как минимум, так

if ($_GET['smile1'] == 'low'){
if($_GET['smile2'] == 'low' && $_GET['smile3'] == 'low'){
    echo "1";
}elseif($_GET['smile2'] == 'low'){
    if($_GET['smile3'] == 'medium'){
        echo "4";
    }elseif($_GET['smile3'] == 'high'){
        echo "7";
    }
}
}

Но можно еще оптимизировать.

Answer 4

Может так подойдет?

if ($_GET[ 'smile1' ] == 'low' && $_GET[ 'smile2' ] == 'low')
    if     ($_GET[ 'smile3' ] == 'low')    echo "1";
    elseif ($_GET[ 'smile3' ] == 'medium') echo "4";
    elseif ($_GET[ 'smile3' ] == 'high')   echo '7';
Answer 5

Еще как вариант

if ($_GET['smile1'] == 'low' && $_GET['smile2'] == 'low') {
    switch ($_GET['smile3']) {
        case 'low':
            echo '1';
            break;
        case 'medium':
            echo '4';
            break;
        case 'high':
            echo '7';
            break;
    }
}
Answer 6

Троичная система счисления же!

Варианты принимаем как:

  • smile1 - (0..2) * 3^0
  • smile2 - (0..2) * 3^1
  • smile3 - (0..2) * 3^2

Принятые числа суммируем, к результату прибавляем 1

Answer 7

С циклом

// Работаем как с троичной системой
$num_value = ['low' => 0, 'medium' => 1, 'high' => 2];
// Имена ключей GET запроса. 
// СНАЧАЛА СТАРШИЙ СМАЙЛ!
$smile_name = ['smile3', 'smile2', 'smile1'];
$value = 0;
foreach($smile_name as $k => $smile){
   $r = $num_value[$_GET[$smile]];
   $value = $value * 3 + $r;
}
$value += 1;
READ ALSO
Загрузка класса с параметрами в codeigniter

Загрузка класса с параметрами в codeigniter

Можно ли в codeigniter загрузить класс с параметрами? Если да, то как? Я пробовал сделать так, но не работает:

166
проблема hasMany в Yii2

проблема hasMany в Yii2

есть вот такой запрос

719
Проблема с изменением данных в базе данных

Проблема с изменением данных в базе данных

Получаю данные из базы данных, они вносятся в поля - http://istack

196
Коррекция даты с учетом года

Коррекция даты с учетом года

Здравствуйте, подскажите есть ли в PHP какая нибудь умная функция, которая принимала бы в качестве базовой даты строку "29 dec 2016" и определяла...

285